Install
$ agentstack add mcp-hupe1980-mako ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ● Network access Used
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
mako ⚡
[](https://github.com/hupe1980/mako/actions/workflows/ci.yml) [](./LICENSE-MIT) [](https://www.rust-lang.org/) [](https://www.edi-energy.de/) [](https://github.com/hupe1980/mako/pkgs/container/makod)
> ⚠️ Experimental — Pre-1.0. APIs may change between releases. Not yet recommended for production without thorough in-house testing.
A Rust workspace for end-to-end German energy market communication (BDEW MaKo / EDI@Energy) — from raw EDIFACT bytes to production microservices.
The workspace covers the full BDEW MaKo stack across four layers:
| Layer | What it is | |---|---| | Protocol | edi-energy EDIFACT · dvgw-edi DVGW gas · redispatch-xml Redispatch 2.0 · mako-engine event-sourced process runtime · makod daemon | | Market data | mako-markt library · marktd Market Data Hub (PostgreSQL, CloudEvents, OIDC/JWT, EventBus) | | Settlement & billing | grid-billing + netzbilanzd NNE/MMM/MSB settlement · eeg-billing + einsd EEG/KWKG · energy-billing + billingd retail billing | | Customer management | accountingd FI-CA ledger · portald customer portal · vertragd contracts · tarifbd tariff catalog · agentd AI orchestration |
Workspace at a Glance
Protocol & Domain Crates
| Crate / service | Purpose | |---|---| | edi-energy | Parse · validate · build all 17 EDI@Energy EDIFACT message types | | mako-engine | Event-sourced runtime: Workflow, Process, EventStore, outbox, deadlines | | mako-gpke | GPKE workflows — UTILMD Strom supplier-switch (55001–55018) + Anfrage Daten (55555, GPKE Teil 4) + Sperrung ORDERS (17115–17117) + INVOIC (31001–31002, 31005–31006) + ORDERS/ORDRSP Konfiguration (17134/17135, 19001/19002) + PARTIN Strom (37000–37006) | | mako-wim | WiM Strom workflows — UTILMD (55039, 55042, 55051, 55168) + MSB-Rechnung INVOIC (31009) + ORDERS/ORDRSP (various) | | mako-geli-gas | GeLi Gas 3.0 workflows — UTILMD G supplier-switch Gas (44001–44021) + INVOIC 31011 (Rechnung sonstige Leistung, AWH Sperrprozesse Gas) | | mako-mabis | MABIS workflows — PID 13003 (Bilanzkreisabrechnung Strom, BKV↔ÜNB) + PIDs 55065/55069/55070 (Clearingliste) | | mako-wim-gas | WiM Gas workflows — UTILMD G MSB-change (44022–44024, 44039–44053, 44168–44170) + INSRPT Gas (23005, 23009) + WiM-Rechnung INVOIC (31003, 31004) | | mako-gabi-gas | GaBi Gas 2.0 (BK7-14-020) — INVOIC 31010/31007/31008 + MSCONS 13013 MMMA + DVGW ALOCAT/NOMINT/NOMRES/SCHEDL/IMBNOT/TRANOT/DELORD/DELRES (8 workflows); typed domain: GasDay (DST-aware 06:00 CET), GasQuantity (Decimal kWh_Hs), GasBeschaffenheit (Hs + Zustandszahl, DVGW G 685), AllocationVersion (Initial/Correction/Final), GasMarketRole, GasPortfolioBalance | | mako-nbw | Netzbetreiberwechsel — PARTIN bulk DSO concession handover (PIDs 37000–37014) — placeholder | | mako-as4 | BDEW AS4 profile constants, P-Mode registry, partner directory, and inbound routing config | | dvgw-edi | DVGW EDIFACT formats — ALOCAT, NOMINT, NOMRES, SCHEDL, IMBNOT, TRANOT, DELORD, DELRES parsing for GaBi Gas 2.0 (BK7-14-020) | | mako-redispatch | Redispatch 2.0 workflows — XML document types (ActivationDocument, Stammdaten, NetworkConstraintDocument, …) + IFTSTA PIDs 21037/21038 | | redispatch-xml | Redispatch 2.0 XML/XSD format parsing — all 9 document types | | energy-api | BDEW API-Webdienste Strom — REST/WebSocket client + Axum server for iMS processes | | mako-markt | Master data library — MaloId, MeloId, MarktpartnerId, repository traits (incl. LokationszuordnungRepository, TechnischeRessourceRepository), CloudEvents, test doubles |
Settlement, Billing & Calculation Crates
| Crate / service | Purpose | |---|---| | grid-billing | Role-neutral German grid settlement engine — calculate_nne_invoice, calculate_mmm_invoice, calculate_msb_invoice, calculate_reversal; returns GridSettlement (no BO4E dep); every position carries CalculationTrace with LegalReferences (StromNEV §17/§21, GasNEV §14, KAV §2, §14a EnWG, ARegV) and TariffSource; Sparte enum drives Gas vs. Strom legal refs automatically; KaKlasse annotates KAV tier; ValidationResult pre-calculation validation; zero I/O | | eeg-billing | Pure EEG/KWKG feed-in settlement library — calculate_settlement for all 9 settlement schemes (SettlementScheme + TariffSource, EEG 2000–2023 + KWKG 2023); §51 Negativpreisregel (version-aware: EEG 2017/2021/2023 thresholds + Bestandsschutz); §51a Verlängerungsanspruch; §52 Pflichtzahlungen (€10/kW) + §52 Abs. 6 Netting; §20 Abs. 3 Managementprämie; §23a quarterly degression; §36k Wind Korrekturfaktor; §24 multi-block CapacityBlock; SettlementPeriodState lifecycle state machine; 324 tests; zero float money; no I/O | | energy-billing | Retail energy billing engine (LF role) — 12 product categories; PricingModel typed dispatch; BillingEngine/BillingProvider pipeline; RLM demand charge; §54 EnergieStG exemption; historic levy lookups; §41a dynamic EPEX; HT/NT ToU; §14a Modul 1/3; XRechnung 3.0 / ZUGFeRD 2.3; 148 tests; zero I/O | | metering | German energy metering domain library — MeterInterval, Gas m³→kWh_Hs (§24 GasGVV / DVGW G 685); billing period aggregation; SLP/RLM/iMSys classification; Hampel quality scoring; V01–V10 validation engine; virtual meters (§42b GGV); BSI TR-03109 SmgwSession/ClsChannel (§14a); §17 MessZV Jahresprognose; 177 tests; zero I/O, no async, no float money | | invoic-checker | INVOIC plausibility — 6 checks (period validity, position arithmetic, document total, tariff match ToU-aware, tariff found, MMM settlement price check) | | netz-checker | NB Anmeldung validation — 6 deterministic checks, ERC A02/A05/A06/A97/A99; no I/O |
Production Services (17 daemons)
| Service | Port | Role | Purpose | |---|---|---|---| | makod | :8080 · :4080 · :8090 | All | Protocol daemon — 45+ GPKE/WiM/GeLi Gas/MABIS/GaBi Gas workflows, AS4/REST/iMS, Cedar ABAC, OIDC/JWT, MCP server | | marktd | :8180 | All | Market Data Hub — MaLo/MeLo/contracts, VersorgungsStatus, typed BO4E API, EventBus fan-out, MMMA monthly import worker | | processd | :8580 | NB+LF+MSB | Process Decision Engine — Anmeldung STP ≥ 95%, LF E_0624 45-min auto-response, MSB REQOTE auto-response, §14a Steuerungsauftrag | | invoicd | :8280 | LF | INVOIC plausibility-check — 6 checks, auto-settle/dispute, §22 MessZV receipts | | netzbilanzd | :8680 | NB | NNE/KA/MMM/MSB/AWH billing — generates INVOIC 31001/31002/31005/31009/31011, full REMADV lifecycle, §14a Modul 2 ToU, §42a GGV, 13-tool MCP server | | sperrd | :8780 | NB | Sperrung execution tracking — IFTSTA 21039 auto-dispatch, GET /stats compliance snapshot, 5-tool MCP server | | edmd | :8380 | All | Energy Data Management — MSCONS, iMSys direct push, Hampel quality scoring, V01–V10 validation, virtual meters (§42b GGV), §17 MessZV Jahresprognose, Iceberg/S3 OLAP, 10-tool MCP server | | mabis-syncd | :8880 | ÜNB/NB | MaBiS UTILTS synchronisation — aggregates per-MaLo Lastgang; submits to BIKO; vorläufig day 3 + endgültig day 8 schedule | | einsd | :9180 | NB/LF | Einspeiser Registry + EEG/KWKG settlement — 9 settlement schemes, §52 sanctions, §51 neg-price, 14 MCP tools + 6 prompts | | obsd | :8480 | All | Business-process observability — KPI reports, §20 EnWG parity, automated deadline computation, GET /api/v1/audit/bnetza-report | | nis-syncd | :9680 | NB | NIS/GIS grid topology import — concurrent sync, drift detection, check_malo_grid MCP tool | | tarifbd | :9080 | LF | Product & Tariff Catalog — user-defined energy products (STROM/GAS/WAERME/SOLAR/EEG/EINSPEISUNG/WAERMEPUMPE/WALLBOX/HEMS/EMOBILITY/ENERGIEDIENSTLEISTUNG/BUNDLE), EPEX Spot for §41a | | billingd | :9280 | LF | Energy Billing Engine — all commercial prices user-defined in tarifbd; pure calculation via energy-billing crate (148 tests); STROM (Eintarif/HT/NT/RLM demand charge leistungspreis_strom_ct_per_kw_month; §14a Modul 1/3); GAS (§10 GasGVV Brennwertkorrektur, Energiesteuer, §54 EnergieStG KWK exemption gas_energiesteuer_befreiung, BEHG CO₂); WAERME; SOLAR §42b/§42a; EEG/EINSPEISUNG; §41a dynamic tariffs; historic levy rate lookups (stromsteuer_for_year, energiesteuer_gas_for_year incl. 2022 0-rate); XRechnung 3.0 / ZUGFeRD 2.3 (EN16931) | | accountingd | :9380 | LF | Massenkontokorrent / Customer Account Ledger — FIFO open-item management (/open-items); SEPA pain.008+pain.001 (sepa 0.3.0); automatic Mahnwesen rule engine (Mahnstufe 1–3); balance reconciliation (/reconcile); GDPR Art. 17 pseudonymization (/anonymize); 71 unit tests | | portald | :9480 | LF | Customer Portal read-model gateway — aggregates Lastgang/invoices/balance/VersorgungsStatus/EEG into single REST + SSE API; OIDC auth | | vertragd | :9780 | LF | Contract & Customer Management — Kunden (B2C + B2B), Rahmenverträge, Versorgungsverträge; triggers GPKE/GeLi Gas Lieferbeginn/-ende; OIDC→MaLo authorization gateway | | agentd | :9580 | All | Multi-agent LLM orchestration — Orchestrator + 24 bundled specialists; 3 LLM providers (OpenAI, Anthropic, AWS Bedrock); LanceDB RAG; WASM plugins |
✨ Features
EDIFACT layer (edi-energy)
| Category | Detail | |---|---| | 📦 17 message types | UTILMD, MSCONS, APERAK, CONTRL, INVOIC, REMADV, ORDERS, IFTSTA, INSRPT, REQOTE, PARTIN, ORDCHG, ORDRSP, QUOTES, COMDIS, PRICAT, UTILTS | | 🔍 5-layer validation | MIG structural rules, AHB Pruefidentifikator-specific rules, semantic cross-field rules | | 📅 Annual release lifecycle | Multi-version profile registry with 7-day transition grace windows (BDEW-compliant) | | 🔒 Security by default | DoS limits (max 10 MB, 10 000 segments), log-injection sanitisation, fuzz-tested with 1 329+ corpus entries | | 🛠️ Fluent message builders | Type-state builder API with compile-time mandatory field enforcement | | 🔁 Round-trip serialisation | Parse → validate → serialize with byte-exact EDIFACT output | | 🧪 Code-generated profiles | 36 profiles across 17 types, regenerated annually via cargo xtask codegen |
DVGW gas transport layer (dvgw-edi)
| Category | Detail | |---|---| | 📦 8 DVGW message types | ALOCAT, NOMINT, NOMRES, SCHEDL, IMBNOT, TRANOT, DELORD, DELRES | | 🔗 Correlation helpers | nomination_ref links NOMINT → NOMRES; order_ref links DELORD → DELRES | | 🔀 Synthetic PID routing | detect_pid(role_qualifier) maps each direction to unique PIDs in range 90001–90062 for mako-engine integration | | 🧪 Independent of edi-energy | Separate DvgwPlatform; shares no parser state with the BDEW EDIFACT stack | | 📜 Regulatory basis | BNetzA BK7-14-020 · DVGW G 685 · Kooperationsvereinbarung Gas |
Redispatch 2.0 XML layer (redispatch-xml)
| Category | Detail | |---|---| | 📦 9 CIM/IEC 62325 document types | ActivationDocument, PlannedResourceSchedule, AcknowledgementDocument, Stammdaten, Unavailability, NetworkConstraintDocument, Kaskade, StatusRequest, Kostenblatt | | 🔍 Two-phase validation | parse_and_validate() — XSD structural check + semantic cross-field rules in one call | | 🔁 Round-trip serialization | Parse → serialize with byte-stable XML output | | 🔑 Document correlation | Document::mrid(), sender_id(), receiver_id() — routing keys for AcknowledgementDocument process matching | | 🔒 #![deny(unsafe_code)] | Memory-safe XML processing; no unsafe in the parse path | | 📜 Regulatory basis | BNetzA BK6-20-059 · BK6-20-060 · BK6-20-061 · NABEG §§ 13, 13a, 14 EnWG |
Master data layer (mako-markt)
| Category | Detail | |---|---| | 🆔 Validated domain IDs | MaloId (11-digit BDEW check-digit), MeloId (DE+31-char), MarktpartnerId (13-digit; auto-derives NAD DE3055 agency code 293/332/9 from prefix) | | 🗂️ Nine repository traits | MaloRepository, MeloRepository, ContractRepository, SubscriptionRepository, CorrelationIndex, PartnerRepository, LokationszuordnungRepository, TechnischeRessourceRepository, SteuerbareRessourceRepository — AFIT, no dyn Trait overhead | | ⏳ Temporal role assignments | Lokationszuordnung with valid_from/valid_to — evaluated against CET/CEST German calendar date at query time | | 📨 CloudEvents 1.0 | Outbound events (MarktEvent) with HMAC-SHA256 signing; InboundMakoEvent for receiving makod lifecycle events | | 🧪 testing feature | InMemory* test doubles for all six traits — no PostgreSQL required in unit tests | | 🚫 Zero framework deps | No axum, sqlx, or async runtime — pure domain library; all I/O lives in services/marktd |
BO4E typed API (marktd)
41 active rubo4e::current types — schema validated at every read/write boundary.
| Category | Detail | |---|---| | 📦 Typed responses | GET /api/v1/malo → Marktlokation; GET /api/v1/melo → Messlokation; GET /api/v1/zaehler → Zaehler; GET /api/v1/geraete → Geraet — all canonical BO4E camelCase | | 🔍 Schema validation on write | PUT endpoints reject wrong _typ with 422; validate enum fields (bilanzierungsmethode, netzebene, vertragsart, …) against rubo4e::current types | | 📋 Vertrag for LRV exchange | nb_contracts stores full BO4E Vertrag JSONB + typed SQL columns; PUT /api/v1/nb-contracts validates vertragsart / vertragsstatus; emits de.markt.nb-contract.updated CloudEvent | | 👤 Geschaeftspartner typed partners | PUT /api/v1/partners/{mp_id} validates the BO4E Geschaeftspartner payload (auto-injects _typ; validates marktrolle, rollencodetyp, marktteilnehmerstatus, adresse). GET returns the typed geschaeftspartner field. | | 🔢 Zaehlwerk register access | GET /api/v1/zaehler/{id}/zaehlwerke → Vec — OBIS registers for TOU billing and iMSyS demand management | | ⏰ ZaehlzeitRegister + ZaehlzeitSaison | GET/PUT /api/v1/zaehler/{id}/register + /zaehler-register/{id}/saisons — iMSys TOU register definitions (HT/NT/EINZEL); GET /api/v1/zaehler/{id}/tariff-zone?datetime=ISO resolves zone in one SQL JOIN (§14a Modul 2) | | ⚡ Energiemenge deliveries | GET /api/v1/deliveries/{malo_id} → Vec — typed ERP-consumable meter readings without EDIFACT parsing | | 💰 MMMA settlement prices | GET/PUT /api/v1/mmma-preise/gas/{year}/{month} — Gas MMM Abrechnungspreise (Trading Hub Europe); GET/PUT /api/v1/mmm-preise/strom/{year}/{month} — Strom MMM Ausgleichsenergie per ÜNB. Both auto-fetched by netzbilanzd and validated by invoicd check 6. | | 🗂️ Fallgruppe + Bilanzierungsmethode auto-extract | makod adapters extract bilanzierungsmethode (Z01→SLP, Z02→RLM, Z04→IMS) and fallgruppe (GaBi Gas, TM+Z10) from UTILMD TM+EM / TM+Z10 segments. marktd event_ingest calls patch_typenmerkmal() on de.mako.process.initiated (PIDs 55001/44001) to keep malo.fallgruppe / malo.bilanzierungsmethode in sync. || 🏷️ Tarifpreisblatt + Preisblatt | tarifbd stores all energy products as Tarifpreisblatt JSONB; category drives calculator selection; all prices are user-defined; schema validated on PUT (wrong _typ → 422); queried by billingd calculator for pricing inputs | | 🧾 Steuerbetrag + Registeranzahl | billingd calculator generates typed Stromsteuer (2.05 ct/kWh) and MwSt (19%) positions as Steuerbetrag entries; Registeranzahl (Eintarif/Zweitarif) drives HT/NT position branching | | 🏦 Zahlungsinformation + Zahlungsart | accountingd SEPA mandate registry stores structured payment info; pain.008 XML generated from SepaMandateRow (IBAN, BIC, Kontoinhaber, Mandatsreferenz) |
Process engine layer (mako-engine + domain crates)
| Category | Detail | |---|---| | ♻️ Event-sourced processes | Optimistic-concurrency event append with SlateDB-backed storage | | ⚛️ **Atomic du
…
Source & license
This open-source MCP server is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: hupe1980
- Source: hupe1980/mako
- License: Apache-2.0
- Homepage: https://hupe1980.github.io/mako/
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.