mastr-mcp-server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mastr-mcp-serversearch for solar power plants in Berlin with capacity > 100 kW"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
MaStR MCP Server
An MCP server for the Marktstammdatenregister (MaStR) — the German energy market master data register operated by the Bundesnetzagentur (Federal Network Agency). Enables Claude Desktop, Cowork, and Claude Code to directly access the German energy plant registry.
Deutsche Version / German version
Features
21 Tools — 14 SOAP (with credentials), 7 Public (always available)
Tool | API | Auth | Description |
| SOAP | Yes | Full unit details + EEG + CHP + permit + storage in one call |
| SOAP | Yes | Filtered search for power generation (all 20 energy carriers, postcode, capacity) |
| SOAP | Yes | Market actor details by MaStR number |
| SOAP | Yes | Daily API quota (used / limit) |
| SOAP | Yes | Delta sync: changes since date (EEG, CHP, permit, location, storage) |
| SOAP | Yes | Filtered search for power consumers (postcode, state, status, etc.) |
| SOAP | Yes | Filtered search for gas production (capacity, postcode, etc.) |
| SOAP | Yes | Filtered search for gas consumers (capacity, postcode, etc.) |
| SOAP | Yes | Filtered search for market actors (function, role, postcode, etc.) |
| SOAP | Yes | Location details incl. linked units + grid connection points |
| SOAP | Yes | Catalog/enum values (legal form, manufacturer, etc.) by category ID |
| SOAP | Yes | List all available catalog categories |
| SOAP | Yes | Balancing areas (Y-EIC codes, control areas), optionally by DSO |
| SOAP | Yes | Grid connection points for a unit (voltage level, location, co-located units) |
| JSON | No | Power generation units (27 filter keys) |
| JSON | No | Market actors (23 filter keys) |
| JSON | No | Power consumption units (29 filter keys) |
| JSON | No | Gas production / gas storage (30 filter keys) |
| JSON | No | Gas consumption units (30 filter keys) |
| JSON | No | Grid connection points & locations (4 types, 12-20 filter keys) |
| SOAP | No | Connection test (always available) |
10 Filter Operators
Suffix | Operator | Description |
(none) / | eq | Equal (default) |
| neq | Not equal |
| ct | Contains |
| nct | Does not contain |
| sw | Starts with |
| ew | Ends with |
| gt | Greater than |
| lt | Less than |
| null | Is NULL |
| nn | Is NOT NULL |
20 Energy Carriers
All technology keywords are available in English (German aliases also work):
wind, solar, biomass, hydro, storage, geo, mine_gas, sewage_sludge,
solar_thermal, pressure_relief_gas/pressure_relief_water, natural_gas, hard_coal, lignite,
mineral_oil, other_gases, waste, heat, hydrogen, nuclear.
Without credentials, 7 public tools are available (search power generation, power consumption, gas production, gas consumption, market actors, grid connections + connection test). With credentials (.env), 14 additional SOAP tools are registered (detail queries, filtered searches, catalogs, balancing areas, etc.).
Related MCP server: strompreis-mcp
Installation
Prerequisites
Python >= 3.10
uv(recommended) orpipMaStR web service account (for SOAP API tools, optional): https://www.marktstammdatenregister.de
Step 1: Clone / copy project
git clone https://github.com/UliRCS/mastr-mcp-server.git
cd mastr-mcp-serverStep 2: Install dependencies
With uv (recommended):
uv syncWith pip:
pip install -e .Step 3: Store credentials in .env
The server automatically loads credentials from a .env file in the project directory (via python-dotenv). This is the recommended approach.
cp .env.example .env
# Edit .env and fill in your values:
# MASTR_USER=SEM123456789012
# MASTR_TOKEN=your-webservice-token-540-chars.env is excluded via .gitignore — your token will not end up in the repo.
Alternative: You can also set the variables as OS environment variables or in the env block of the Claude Desktop config — OS values take precedence.
Step 4: Test
# Quick test
uv run mastr_mcp_server.py
# Or with the MCP Inspector
npx @modelcontextprotocol/inspector uv run mastr_mcp_server.pyConfiguration for Claude Desktop / Cowork
Open the Claude Desktop configuration file:
Windows:
%APPDATA%\Claude\claude_desktop_config.jsonmacOS:
~/Library/Application Support/Claude/claude_desktop_config.json
If .env is in the project directory, you can omit the env block:
{
"mcpServers": {
"mastr": {
"command": "uv",
"args": [
"run",
"--directory", "/path/to/mastr-mcp-server",
"mastr_mcp_server.py"
]
}
}
}Important: Adjust the path under --directory to the actual location on your system.
Configuration for Claude Code
claude mcp add mastr \
--command "uv" \
--args "run" "--directory" "/path/to/mastr-mcp-server" "mastr_mcp_server.py" \
--env "MASTR_USER=SOM123456789012" \
--env "MASTR_TOKEN=your-webservice-token"Usage Examples
"Show me the details of wind turbine SEE966095906064" ->
get_unit"Find all solar plants in postcode 49074" ->
search_power_generation_public({'tech': 'solar', 'postcode': '49074'})"Wind turbines between 1200 and 3500 kW in postcode area 23..." ->
search_power_generation_public({'tech': 'wind', 'capacity>': 1200, 'capacity<': 3500, 'postcode:': '23'})"Wind turbines WITHOUT EEG key" ->
search_power_generation_public({'tech': 'wind', 'eeg_key?': ''})"All non-wind units in postcode 49074" ->
search_power_generation_public({'tech!=': '2497', 'postcode': '49074'})"Power-to-Gas hydrogen plants" ->
search_gas_production_public({'gas_technology': 'Power-to-Gas (Wasserstoff)'})"High-voltage consumers in Bavaria" ->
search_power_consumption_public({'bundesland': 'Bayern', 'voltage_level': 'Hochspannung'})"Gas consumers with H-Gas that generate electricity" ->
search_gas_consumption_public({'gas_quality': 'H-Gas', 'gas_for_power': True})"DSOs with more than 100,000 connected customers in Lower Saxony" ->
search_actors_public({'function': 'Stromnetzbetreiber', 'dso_large': True, 'bundesland': 'Niedersachsen'})"Grid connection points for power generation in postcode 49074 at medium voltage" ->
search_grid_connections_public('power_generation', {'postcode': '49074', 'voltage_level': 'Mittelspannung'})"Gas feed-in points with H-Gas" ->
search_grid_connections_public('gas_production', {'gas_quality': 'H-Gas'})
Project Structure
mastr-mcp-server/
├── mastr_mcp_server.py # Entry point (imports package, starts server)
├── mastr_mcp/ # Main package
│ ├── __init__.py # Package init, conditional tool registration
│ ├── config.py # Constants, env vars, technology mappings
│ ├── serialization.py # SOAP->JSON, MS-AJAX date conversion
│ ├── client.py # SOAP client, HTTP fetch, retry helper
│ ├── filters.py # Filter builder, column mappings, dropdown loading
│ ├── server.py # FastMCP instance with instructions
│ ├── tools_soap.py # SOAP tools (14)
│ ├── tools_public.py # Public JSON tools (7)
│ └── resources.py # MCP Resources (4)
├── *_dropdowns.json # Dropdown ID mappings (5 files, from live API)
├── pyproject.toml # Dependencies and metadata
├── .env # Credentials (not in git)
└── .env.example # Credential templateSecurity Notes
The MaStR token is confidential — it belongs in
.env, never in the repo.The server only performs read operations (no registrations or modifications)
Daily limit: 100,000 SOAP API calls per user (public JSON is unlimited)
Only TLS 1.2 connections are accepted
License
MIT
Available Tools
7 toolsget_local_timeA
Connection test — returns current server time if MaStR SOAP service is reachable.
No authentication required. Use this to verify network connectivity.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes the tool as a test returning server time with no authentication, which sufficiently discloses its behavior given its simplicity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with purpose, no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple test tool with no parameters and no output schema, the description is fully adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist, and description adds nothing beyond schema, but baseline of 4 is appropriate for zero-parameter tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it is a connection test that returns server time, distinguishing it from sibling search tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use this to verify network connectivity' and notes no authentication required, providing clear context for use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_actors_publicA
Search market actors (Marktakteure) — no auth required.
Find energy market participants: DSOs (Netzbetreiber), generators, suppliers, traders, and more. 23 filter keys for name, function, role, location, status, and DSO flags (large DSO, closed distribution network).
NOTE: MaStR stores '&' as fullwidth U+FF06 in company names. Use 'name%' with a substring without '&' for reliable company name searches.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. | |
| filters | Yes | Filter dict with optional operator suffixes on each key. Operators: '=' (eq, default), '!=' (neq), '%' (contains), '!%' (not contains), ':' (starts with), '$' (ends with), '>' (gt), '<' (lt), '?' (is null), '!' or '!?' (is not null). Supported filter keys: name, mastr_number, bnetza_number, acer_code, vat_id, register_court, register_number, function, roles, industry_group, postcode, city, street, bundesland, nuts_region, status, registration_date, last_update, activity_start, activity_end, dso_large, dso_closed, sme_flag. Dropdown fields (bundesland, function, status, roles, nuts_region, industry_group) accept label or MaStR ID. Boolean fields (dso_large, dso_closed, sme_flag) accept true/false, ja/nein, 1/0. NOTE: MaStR stores '&' as fullwidth U+FF06 — use 'name%' with a substring without '&' for company name searches. Example: {'function': 'Stromnetzbetreiber', 'dso_large': True} | |
| page_size | No | Page size (max 5000). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It states 'no auth required', mentions 23 filter keys, and notes the special handling of '&' characters. However, it does not disclose pagination behavior, rate limits, or error responses, leaving some gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured. It front-loads the purpose, uses bold for emphasis, and employs a clear note format. Every sentence adds necessary information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of an output schema, the description does not explain return values. It mentions 23 filter keys but not their full meaning (schema does). Pagination limits are partially covered. For a public search tool, more detail on response structure would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema documents all parameters. The description adds value by explaining the operator suffixes for filters, dropdown field acceptance of labels/IDs, boolean field formats, and a notable tip about searching with '&' in company names. This goes beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches for market actors (Marktakteure) and lists examples like DSOs, generators, suppliers. It distinguishes from sibling tools that search other specific domains (power generation, consumption, gas, etc.).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for finding energy market participants but does not explicitly compare to siblings or provide when-not-to-use scenarios. The context of sibling tool names gives some guidance, but the description itself lacks direct usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_gas_consumption_publicA
Search gas consumption units (Gasverbrauch) — no auth required.
Find registered gas consumers. 30 filter keys covering identification, location, dates, gas quality (H-Gas/L-Gas), maximum capacity, and whether the gas is used for power generation (gas_for_power flag).
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. | |
| filters | Yes | Filter dict with optional operator suffixes on each key. Operators: '=' (eq, default), '!=' (neq), '%' (contains), '!%' (not contains), ':' (starts with), '$' (ends with), '>' (gt), '<' (lt), '?' (is null), '!' or '!?' (is not null). Supported filter keys: name, mastr_number, mastr_operator, location_mastr, dso_mastr, operator_name, dso_name, postcode, city, landkreis, street, bundesland, municipality, municipality_key, landmark, parcel, country, longitude, latitude, status, commission_date, current_location_date, shutdown_date, planned_date, registration_date, last_update, max_gas_capacity, gas_quality, gas_for_power, dso_check. Dropdown fields (status, bundesland, country, gas_quality, dso_check) accept label or MaStR ID. gas_quality values: 'H-Gas', 'L-Gas'. gas_for_power is a boolean (true/false, ja/nein). Example: {'gas_quality': 'H-Gas', 'gas_for_power': True} | |
| page_size | No | Page size (max 5000). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description discloses 'no auth required' and that it searches gas consumers, but it omits behavioral traits such as pagination, return format, or idempotency. It does not specify whether the tool is read-only or describe any side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with three sentences: a bold statement of purpose, a short clarifying line, and a list of filter categories. It is front-loaded with key information and contains no unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of the tool (3 parameters, nested filters, no output schema), the description lacks information about what the search returns (e.g., fields of results), pagination details beyond what the schema provides, and usage boundaries. It covers the core purpose and filter categories but is not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents parameters thoroughly. The description adds some context by highlighting filter categories and giving examples, but it does not significantly augment the schema's parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches for gas consumption units (Gasverbrauch) with 'Search' as the verb and specifies the resource as 'gas consumption units' (gas consumers). It distinguishes itself from siblings like search_power_consumption_public and search_gas_production_public by explicitly targeting gas consumption.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description indicates the tool requires no authentication and is for finding registered gas consumers, which implies its appropriate context. However, it does not provide explicit when-to-use or when-not-to-use guidance or mention alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_gas_production_publicA
Search gas production and storage units (Gaserzeugung) — no auth required.
Find biogas plants, Power-to-Gas (hydrogen/methane), LNG terminals, fossil gas producers, and gas storage units. 30 filter keys including gas technology and unit type (producer vs. storage).
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. | |
| filters | Yes | Filter dict with optional operator suffixes on each key. Operators: '=' (eq, default), '!=' (neq), '%' (contains), '!%' (not contains), ':' (starts with), '$' (ends with), '>' (gt), '<' (lt), '?' (is null), '!' or '!?' (is not null). Supported filter keys: name, mastr_number, mastr_operator, location_mastr, dso_mastr, operator_name, dso_name, postcode, city, landkreis, street, bundesland, municipality, municipality_key, landmark, parcel, country, longitude, latitude, status, commission_date, current_location_date, shutdown_date, planned_date, registration_date, last_update, gas_production_capacity, gas_technology, unit_type, dso_check. Dropdown fields (status, bundesland, country, gas_technology, unit_type, dso_check) accept label or MaStR ID. gas_technology values: 'Biomethan-Erzeugung', 'Förderung fossilen Erdgases', 'Liquefied Natural Gas', 'Power-to-Gas (Methan)', 'Power-to-Gas (Wasserstoff)'. unit_type values: 'Gaserzeugungseinheit', 'Gasspeichereinheit'. Example: {'gas_technology': 'Power-to-Gas (Wasserstoff)', 'status': 'In Betrieb'} | |
| page_size | No | Page size (max 5000). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description covers key behavioral aspects: it is a read-only public search (no auth), details filter operators and dropdown fields, and provides an example. It does not mention rate limits or pagination behavior beyond default page size, but these are less critical for search.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficient: two short paragraphs, bolded key phrase, and bullet-like listing. Every sentence adds value without redundancy, making it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no output schema and nested objects. The description focuses on input parameters and search scope but does not explain return fields or structure. For a search tool, this is adequate but could mention typical response fields (e.g., unit details, capacity).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 100% description coverage with each parameter documented. The description adds significant value by listing filter key categories (gas technology, unit type) and explaining operators, dropdown values, and an example, greatly enhancing understanding beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it searches gas production and storage units (Gaserzeugung), listing specific types like biogas, Power-to-Gas, LNG, fossil gas, and storage, and explicitly says no auth required. It distinguishes from sibling tools like search_power_generation_public by targeting gas-specific entities.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description indicates it is for public data (no auth) and lists the types of units, implying use for gas-related searches. However, it does not explicitly state when not to use it or provide direct comparisons to siblings, but the context from sibling names (power, actors, consumption) gives guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_grid_connections_publicA
Search grid connection points and locations (Netzanschlusspunkte) — no auth required.
Find where units connect to the grid. Returns location data, grid connection points, linked units, DSO info, and network parameters. Supports 4 connection types: power generation/consumption and gas production/consumption. Power types include voltage level, control area, and balancing area. Gas types include gas quality and market area.
For grid connection details of a specific unit, use get_grid_connection (SOAP).
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. | |
| filters | Yes | Filter dict with optional operator suffixes on each key. Operators: '=' (eq, default), '!=' (neq), '%' (contains), '!%' (not contains), ':' (starts with), '$' (ends with), '>' (gt), '<' (lt), '?' (is null), '!' or '!?' (is not null). Shared filter keys (all 4 types): location_mastr, location_name, nap_mastr, nap_name, dso_mastr, dso_name, unit_mastr, postcode, city, municipality, municipality_key, capacity, planned. Power (Strom) types add: voltage_level, voltage_level_id, control_area, control_area_id, balancing_area, metering_location. power_generation also has: unit_types. Gas types add: gas_quality, gas_quality_id, market_area, market_area_id. planned is a boolean (true/false). Dropdown fields accept both label and numeric ID (e.g. voltage_level='Mittelspannung' or voltage_level_id='352'). Example: {'postcode': '49074', 'voltage_level': 'Mittelspannung'} | |
| page_size | No | Page size (max 5000). | |
| connection_type | Yes | Type of grid connection. One of: 'power_generation' (Stromerzeugung), 'power_consumption' (Stromverbrauch), 'gas_production' (Gaserzeugung), 'gas_consumption' (Gasverbrauch). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided. Description discloses 'no auth required', return data types, and supported connection types. However, misses details on rate limits, pagination behavior, error handling, or response structure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is well-structured with bolded main point, clear paragraphs for returns and types, and efficient one-sentence alternative guidance. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, description adequately covers return data types and connection types. Could improve by detailing output structure or field examples, but overall sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, baseline 3. Description adds significant value beyond schema by explaining filter operators, shared vs type-specific keys, boolean 'planned', and dropdown field format (label/ID).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it searches grid connection points and locations, using specific verb 'Search' and resource 'grid connection points and locations'. It distinguishes from sibling tool get_grid_connection for specific unit details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit alternative tool (get_grid_connection) for specific unit details. Does not directly compare with sibling search tools like search_power_generation_public, but implies this tool is for connection points across all types.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_power_consumption_publicA
Search power consumption units (Stromverbrauch) — no auth required.
Find large electricity consumers registered in MaStR. 29 filter keys covering identification, location, dates, voltage level, and DSO checks.
Use this when searching for electricity consumers (not generators).
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. | |
| filters | Yes | Filter dict with optional operator suffixes on each key. Operators: '=' (eq, default), '!=' (neq), '%' (contains), '!%' (not contains), ':' (starts with), '$' (ends with), '>' (gt), '<' (lt), '?' (is null), '!' or '!?' (is not null). Supported filter keys: name, mastr_number, mastr_operator, location_mastr, dso_mastr, operator_name, dso_name, postcode, city, landkreis, street, bundesland, municipality, municipality_key, landmark, parcel, country, longitude, latitude, status, commission_date, current_location_date, shutdown_date, planned_date, registration_date, last_update, large_consumers, voltage_level, dso_check. Dropdown fields (status, bundesland, country, voltage_level, dso_check) accept label or MaStR ID. Example: {'bundesland': 'Bayern', 'voltage_level': 'Hochspannung'} | |
| page_size | No | Page size (max 5000). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that no authentication is required, that it finds large consumers in MaStR, and lists 29 filter keys across categories. Since no annotations are provided, the description carries full burden and does well, though it could mention return format or data freshness.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with three short paragraphs: purpose/auth, details, usage guidance. Information is front-loaded and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description could mention what the response contains. It does state it finds large consumers, but lacks specifics. Otherwise, it covers all input parameters and usage context well.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, baseline 3. The description adds value by explaining filter operator suffixes, listing all filter keys, and providing an example. This goes beyond the schema descriptions, which are brief.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it searches for power consumption units (electricity consumers) and distinguishes from generators. It specifies the resource type and verb, and the context signals include a sibling tool for generation, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use this when searching for electricity consumers (not generators),' providing a clear directive and pointing to the sibling tool for generation. This is excellent guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_power_generation_publicA
Search power generation units (Stromerzeugung) — no auth required.
The primary tool for finding wind turbines, solar panels, biomass plants, hydro, storage, gas turbines, nuclear plants, etc. in the MaStR register. Supports all 20 energy carriers with 27 filter keys and 10 operators.
Use this as the default search tool for power generation questions. For full unit details after finding a MaStR number, use get_unit (SOAP).
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. | |
| filters | Yes | Filter dict with optional operator suffixes on each key. Operators: '=' (eq, default), '!=' (neq), '%' (contains), '!%' (not contains), ':' (starts with), '$' (ends with), '>' (gt), '<' (lt), '?' (is null), '!' or '!?' (is not null). Supported filter keys: tech, name, eeg_key, mastr_number, mastr_operator, capacity, capacity_netto, postcode, city, landkreis, street, bundesland, longitude, latitude, status, commission_date, eeg_commission_date, operator_name, wind_park, wind_manufacturer, hub_height, rotor_diameter, solar_park, storage_capacity, storage_mastr_number, storage_technology, battery_technology. tech shortcuts: 'wind', 'solar'/'pv', 'biomass', 'hydro', 'storage', 'geo', 'natural_gas', 'nuclear', 'hydrogen', etc. German aliases also work (erdgas, kernkraft, wasserstoff, etc.). Dropdown fields (bundesland, status, wind_manufacturer, storage_technology, battery_technology) accept label or MaStR ID. Example: {'tech': 'wind', 'bundesland': 'Niedersachsen', 'capacity>': 3000, 'eeg_key!?': ''} | |
| page_size | No | Page size (max 5000). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states 'no auth required' and implies a read-only search, but with no annotations, the burden is on the description. It does not explicitly declare read-only, rate limits, or other behavioral traits beyond auth. Adequate but could be more transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (around 100 words), well-structured with bullet points, and front-loads the purpose. Every sentence adds value, no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex search tool with many filter keys and operators, the description covers the essentials: filter syntax, supported keys, tech shortcuts, and dropdown fields. No output schema is provided, but the tool is a search that likely returns a list of units; the description is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds significant value: it explains filter operators, provides examples, lists tech shortcuts, and mentions German aliases and dropdown field behavior. This goes beyond the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Search power generation units' and lists specific energy carriers (wind, solar, biomass, etc.), distinguishing it from sibling search tools (e.g., search_actors_public). The verb 'search' and resource 'power generation units' are explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description advises 'Use this as the default search tool for power generation questions' and directs users to get_unit for full details after finding a MaStR number. It provides clear context but does not explicitly exclude other search tools for power generation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
7 tool updates
v1.0.1- First observed
get_local_time - First observed
search_actors_public - First observed
search_gas_consumption_public - First observed
search_gas_production_public - First observed
search_grid_connections_public - First observed
search_power_consumption_public - First observed
search_power_generation_public
TDQS
Scored across 7 tools
Each tool targets a distinct entity type (power generation, actors, consumption, gas production, gas consumption, grid connections) and the connection test. No overlap in purpose; descriptions clearly differentiate them.
All search tools follow a consistent 'search_{domain}_public' pattern. The lone 'get_local_time' breaks the pattern but serves a distinct health-check purpose, so the deviation is minor and acceptable.
With 7 tools, the set covers the major queryable entities in MaStR without being excessive. Each tool serves a clear role, and the count is appropriate for the server's scope.
The tools cover searching for all main entity types, but lack retrieval of full details (e.g., get_unit, get_grid_connection) after search, requiring external SOAP calls. This is a notable gap for a complete workflow.
Maintenance
Related MCP Connectors
An MCP server that provides access to Testiny projects, test cases and test runs
GovData.de MCP — Germany's national open-data portal (CKAN API).
MCP server for querying and analyzing data from ad platforms, analytics tools, and spreadsheets
Search and discover 25,000+ MCP servers across all major registries. Connect and pay autonomously.
Related MCP Servers
- AlicenseAqualityBmaintenanceOne-call Australian energy-market plumbing via AEMO — cited, structured responses for market data and analysis, not a data broker.5140 PyPIMIT
- AlicenseNot gradedqualityCmaintenanceMCP server that gives AI agents real-time German electricity price forecasts.2MIT
- AlicenseNot gradedqualityCmaintenanceMCP server for querying ENTSO-E Transparency Platform data including actual load, generation per type, cross-border flows, and installed capacity.1 npmMIT
- AlicenseAqualityAmaintenanceMCP server for Swiss electricity data from three official sources — production mix, consumption forecast, storage-lake fill, consumer price index, tariffs per municipality, and dataset discovery. Zero authentication.1219 PyPIMIT