_ registry / mcp streamable-http · checked 2h ago

NEMPulse MCP

https://nempulse.com.au

Registry code: 62ef9a4ef720bb9b

api record

NEMPulse: Australian NEM grid-scale battery (BESS) data, derived from AEMO public reports. Read-only, no auth.

Workflow: batteries are identified by DUID (e.g. HPR1 = Hornsdale). If you only have a station name, call list_bess_units first to find the DUID. Then use get_battery_revenue for revenue (daily, by market), get_battery_detail for a single-unit snapshot, get_battery_optimal for actual vs optimal dispatch, get_rankings for a league table, and list_events / get_event_detail for price events. query_nem_data answers ad hoc questions the other tools cannot, but it is slow and the least…

endpoint
https://nempulse.com.au/mcp
protocol
streamable-http ·2025-06-18
authentication
none observed
public key
none — nobody has proven they own this listing · is it yours? claim it
karma
0 · newcomer
_ is it live, free and safe measured by this hub
Is NEMPulse MCP live?
Yes — it answered the hub's last check (checked 2h ago). It answered 100% of checks over the last 30 days.
Is NEMPulse MCP free to use?
Not measured yet.
What tools does NEMPulse MCP have?
11 tools: list_bess_units, get_battery_detail, get_battery_revenue, get_battery_optimal, list_events, get_event_detail, get_regional_prices, get_simulator_revenue, ….
Is NEMPulse MCP safe to connect?
The hub found no text in its card or tool descriptions aimed at the agent reading them. It measures what the server answers, not its code — grant it only the access its tools need.
reachable
live
uptime, 30 days
100%

90 days 100%· all time 100%

latency
1,793ms

last good check

priced tools
0

of 11 tools

_ answered our checks, 90 days 80 checks · signed record
  • unknown → live
_ usage and payments 30 days

Calls placed through this hub's router, from its own receipts. Every caller and every payer counts the same; the chain total is counted from three payers.

accounts
0

through this hub

calls served
0

successful

paid through this hub
0 USDC

what callers paid

_ what it can do 11 tools
11 never probed 0 of 11 classified

Price is per tool, not per server. An agent whose handshake is open can hold tools that demand a key or a payment, and one figure for the whole agent sends callers into a wall.

  • list_bess_units unknown never probed

    Reference list of every NEM-registered grid-scale battery. Call this first to turn a station name into the DUID the other tools need. Returns the whole fleet in one response (no filters): DUID, station, region, MW/MWh, MLF, coordinates, is_commissioning, commercial_context, unit_class, peer_comparable, rev_per_mw_yr. Caveats on the fields follow. rev_per_mw_yr is trailing 365-day energy + FCAS revenue (NOT FPP), gross (no MLF), divided by Max Cap MW, then annualised over the days the unit actually had dispatch data — not over a fixed 365-day denominator. This is a rough simulator guide, NOT a performance ranking. It is distorted for any unit with is_commissioning=true or commissioned within the last 365 days, because that span-annualisation extrapolates a few months of ramp-up behaviour out to a full year (scale-up factors of 1.5x-2.4x are live in the current data), which magnifies both weak and negative figures rather than diluting them — do NOT try to 'correct' it by rescaling to the unit's operating span, as that double-counts the annualisation. It is also inflated for small FCAS-primary units, and structurally biased against longer-duration units (shorter-duration units can concentrate power into the highest-price intervals). Do not use it to compare units, rank performance, or answer 'which battery earns most' — use get_battery_revenue over a matched window, or get_battery_optimal for capture. Before comparing any two units' revenue, check BOTH labels on each. commercial_context (TOLLED/CONTRACTED) means the unit does not trade merchant, so its spot revenue is not comparable; a null here means no publicly documented arrangement was found, NOT that the unit is confirmed merchant — only an explicit MERCHANT value means that, and most units are null. unit_class is the structural label (STANDALONE/HYBRID/NETWORK-SUPPORT/MICRO): peer_comparable is false for the latter three, whose dispatch answers to a co-located generator, a non-market obligation, or sub-10MW FCAS granularity rather than to price. Never pool a peer_comparable=false unit into a cross-unit statistic or ranking. Null until the first background refresh completes.

    mcp-tool

    {
      "type": "object",
      "properties": {},
      "additionalProperties": false
    }
    arguments 5 lines
  • get_battery_detail unknown never probed

    Deep-dive metrics for one battery by DUID (e.g. HPR1 = Hornsdale): revenue, dispatch, SOC, FCAS. WARNING: rev_today, energy_rev_today, fcas_rev_today and contingency_fcas_rev_today are MONTH-TO-DATE by default, not daily (matching the rev_mtd keys in fcas_breakdown) — do not report them as 'today's revenue'. throughput_cycles, throughput_mwh, avg_dispatch_price, avg_charge_price and efficiency_pct cover the same window. Pass date_from and date_to (both required together) to scope this window explicitly, e.g. to a single day, instead of relying on the month-to-date default. For a true daily time series use get_battery_revenue. rte_pct is NOT window-scoped: it is the unit's latest measured round-trip efficiency (fitted from AEMO's reported energy storage against its dispatch over a trailing 30 days, refreshed weekly), and is null for units whose fit has not cleared its acceptance checks — null means 'not measured', never 'inefficient'. Also returns commercial_context (e.g. TOLLED, CONTRACTED) and commercial_note — ALWAYS check commercial_context before comparing this unit's revenue against another unit's: tolled/contracted units do not trade merchant and their spot figures are not comparable.

    mcp-tool

    {
      "type": "object",
      "required": [
        "duid"
      ],
      "properties": {
        "duid": {
          "type": "string",
          "description": "Battery DUID, e.g. HPR1. Use list_bess_units to find it from a station name."
        },
        "date_to": {
          "type": "string",
          "description": "Optional end date YYYY-MM-DD (requires date_from too)."
        },
        "date_from": {
          "type": "string",
          "format": "date",
          "description": "Optional start date YYYY-MM-DD (scopes revenue/throughput stats; requires date_to too). Omit both for the month-to-date default."
        }
      },
      "additionalProperties": false
    }
    arguments 22 lines
  • get_battery_revenue unknown never probed

    Daily gross-spot revenue by market (energy + FCAS) for one battery (DUID) over a date range. Daily grain only. This is the tool for total revenue questions — use get_battery_optimal only for the actual-vs-perfect-foresight benchmark, not as a revenue source (its 'actual' figure is MLF-adjusted and solved-days-only, so it will not match this tool's totals). Each day also carries energy_rev_mlf_adjusted (null if the LP backcast hasn't run for that day yet, not zero) alongside the gross energy_rev, so MLF-adjusted figures are available here too without switching tools.

    mcp-tool

    {
      "type": "object",
      "required": [
        "duid",
        "date_from",
        "date_to"
      ],
      "properties": {
        "duid": {
          "type": "string",
          "description": "Battery DUID, e.g. HPR1. Use list_bess_units to find it from a station name."
        },
        "date_to": {
          "type": "string",
          "format": "date",
          "description": "End date, YYYY-MM-DD (inclusive)."
        },
        "date_from": {
          "type": "string",
          "format": "date",
          "description": "Start date, YYYY-MM-DD (inclusive)."
        }
      },
      "additionalProperties": false
    }
    arguments 25 lines
  • get_battery_optimal unknown never probed

    Actual vs LP-optimal dispatch revenue, per-DUID summary, over a date range (energy-only, perfect-foresight benchmark). NOT a revenue-total source — use get_battery_revenue for that. Both the 'actual' AND the 'optimal' figures here are MLF-adjusted (get_battery_revenue's is gross) — the LP's objective is solved on MLF-adjusted prices, not just settled at them afterward — and both cover solved LP days only (days where the solver failed are dropped from both), so the two tools' totals will not match even for the same DUID and date range. The requested date_to may also be silently truncated to the latest date with sufficient fleet-wide LP coverage. Pass duid to restrict to one battery — omitting it scans every DUID and can time out even on a ~3-week range; even a single-DUID, single-month scan has been observed to time out, so keep date ranges short and retry narrower on a timeout.

    mcp-tool

    {
      "type": "object",
      "required": [
        "date_from",
        "date_to"
      ],
      "properties": {
        "duid": {
          "type": "string",
          "description": "Battery DUID, e.g. HPR1 (optional — omit for all DUIDs)"
        },
        "date_to": {
          "type": "string",
          "format": "date",
          "description": "End date, YYYY-MM-DD (inclusive)."
        },
        "date_from": {
          "type": "string",
          "format": "date",
          "description": "Start date, YYYY-MM-DD (inclusive)."
        }
      },
      "additionalProperties": false
    }
    arguments 24 lines
  • list_events unknown never probed

    List NEM spot-price events, newest first. An event is a run of 5-minute intervals in one region where the price stays above $500/MWh or below -$200/MWh (short gaps are bridged), typed by its peak price: negative (below -$200), elevated (peak $500 to $1,000), spike ($1,000 to $5,000) or extreme ($5,000 and above). Each event has event_id, region, event_type, started_at, ended_at, duration_min, peak_rrp, avg_rrp and is_open (still ongoing). Filter by region, event_type and a date range. By default only event summaries are returned; set include_responses to true to also get how each battery behaved during each event, in which case keep limit small (response rows make the payload large and it is truncated at about 100 KB). Use get_event_detail for one event's battery responses.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "limit": {
          "type": "integer",
          "maximum": 500,
          "minimum": 1,
          "description": "Max events to return (default 10, max 500)."
        },
        "offset": {
          "type": "integer",
          "minimum": 0,
          "description": "Skip this many events, for paging (default 0)."
        },
        "region": {
          "enum": [
            "NSW1",
            "QLD1",
            "SA1",
            "TAS1",
            "VIC1"
          ],
          "type": "string",
          "description": "NEM region code: NSW1, QLD1, SA1 (South Australia), TAS1 or VIC1."
        },
        "date_to": {
          "type": "string",
          "format": "date",
          "description": "Optional. Only events starting on or before this date, YYYY-MM-DD."
        },
        "date_from": {
          "type": "string",
          "format": "date",
          "description": "Optional. Only events starting on or after this date, YYYY-MM-DD."
        },
        "event_type": {
          "enum": [
            "negative",
            "elevated",
            "spike",
            "extreme"
          ],
          "type": "string",
          "description": "Optional event type filter."
        },
        "include_responses": {
          "type": "boolean",
          "description": "Also return per-battery responses for each event (default false)."
        }
      },
      "additionalProperties": false
    }
    arguments 52 lines
  • get_event_detail unknown never probed

    One price event by event_id (take the id from list_events), with the response of every battery that was online, ranked by est_revenue. Event fields are as in list_events. Each battery row has duid, station, region, response (DISCH = discharging, CHRG = charging, IDLE, OFFLINE = no availability), avg_mw (positive is discharge), peak_mw, est_revenue (energy only, sum of MW times price over the event, gross, not MLF-adjusted; excludes FCAS), soc_pct at start and soc_pct_end, availability_mw, fcas_mw (average FCAS commitment), plus is_commissioning, unit_class and peer_comparable. Check those labels before comparing units. Per-interval dispatch during the event is not exposed.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Event id, as returned in event_id by list_events."
        }
      },
      "additionalProperties": false
    }
    arguments 13 lines
  • get_regional_prices unknown never probed

    Daily minimum, maximum and mean regional reference price (RRP, $/MWh) for one NEM region over a date range. Daily summary only: the raw 5-minute price series is not exposed (it is published by AEMO on NEMWEB). Use it for price context around revenue or events. For individual price spikes use list_events.

    mcp-tool

    {
      "type": "object",
      "required": [
        "region",
        "date_from",
        "date_to"
      ],
      "properties": {
        "region": {
          "enum": [
            "NSW1",
            "QLD1",
            "SA1",
            "TAS1",
            "VIC1"
          ],
          "type": "string",
          "description": "NEM region code: NSW1, QLD1, SA1 (South Australia), TAS1 or VIC1."
        },
        "date_to": {
          "type": "string",
          "format": "date",
          "description": "End date, YYYY-MM-DD (inclusive)."
        },
        "date_from": {
          "type": "string",
          "format": "date",
          "description": "Start date, YYYY-MM-DD (inclusive)."
        }
      },
      "additionalProperties": false
    }
    arguments 32 lines
  • get_simulator_revenue unknown never probed

    Modelled revenue for a hypothetical 1 MW battery of a given duration in one region (not a real unit), from NEMPulse's optimal-dispatch model on real prices. Returns P10/P50/P90 revenue for three tiers: realistic (forecast-informed result scaled by the capture ratio real batteries achieve, the only tier to use as a project case), forecast_informed (idealised execution on AEMO's public price forecast) and perfect (an unreachable ceiling). Also energy_share and fcas_share, a monthly series, and the real-unit cohorts behind the FCAS cap and the capture ratio. Gross spot revenue only, before costs, degradation and financing. It is a screening estimate, not a forecast of future revenue.

    mcp-tool

    {
      "type": "object",
      "required": [
        "region",
        "duration"
      ],
      "properties": {
        "region": {
          "enum": [
            "NSW1",
            "QLD1",
            "SA1",
            "TAS1",
            "VIC1"
          ],
          "type": "string",
          "description": "NEM region code: NSW1, QLD1, SA1 (South Australia), TAS1 or VIC1."
        },
        "duration": {
          "enum": [
            1,
            2,
            4
          ],
          "type": "number",
          "description": "Battery duration in hours: 1, 2 or 4."
        }
      },
      "additionalProperties": false
    }
    arguments 30 lines
  • get_fleet_summary unknown never probed

    Fleet-wide snapshot for the NEM battery fleet: unit_count, active_unit_count, total_mw, total_mwh, fleet_rev_mtd, avg_efficiency_pct, last_interval and spot_prices (latest price per region, $/MWh). Covers month-to-date unless date_from and date_to are given. fleet_rev_mtd is gross spot revenue (energy + FCAS + FPP) over that window, whatever its length, despite the name. avg_efficiency_pct is dollar-weighted actual energy revenue as a share of the perfect-foresight optimum (a capture rate), null if the optimisation has not run for the window. Commissioning units are excluded from the efficiency figure unless include_commissioning is true. For one battery use get_battery_detail; for a ranking use get_rankings.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "date_to": {
          "type": "string",
          "format": "date",
          "description": "Optional. End date YYYY-MM-DD (requires date_from)."
        },
        "date_from": {
          "type": "string",
          "format": "date",
          "description": "Optional. Start date YYYY-MM-DD (requires date_to). Omit both for month-to-date."
        },
        "include_commissioning": {
          "type": "boolean",
          "description": "Include units still commissioning in the efficiency figure (default false)."
        }
      },
      "additionalProperties": false
    }
    arguments 20 lines
  • query_nem_data unknown never probed

    Last resort for ad hoc questions the other tools cannot answer. Not for live or current prices: NEMPulse publishes daily price summaries only; use get_regional_prices for daily min/max/mean RRP and AEMO NEMWEB DISPATCHPRICE for the live 5-minute feed. Takes a plain-English question, generates SQL over NEMPulse's tables, and returns the SQL, the result rows and a short explanation. It is the slowest tool (can take close to a minute) and it is AI-generated, so check the returned SQL before relying on a number. Scope each question to about one region-month or less: wider aggregates (a full year by region, or per-day top-N across all regions) risk exceeding the 8 second SQL limit, and a longer wait does not help. For per-day top-N or bottom-N questions, ask for a window function (ROW_NUMBER or RANK) rather than a per-day subquery, which has been seen to silently return all-null rows. Queryable data: dispatch prices, daily revenue, optimal dispatch, battery price profiles and market events. The market analysis tables (monthly spreads, regressions, correlations) are not reachable here.

    mcp-tool

    {
      "type": "object",
      "required": [
        "question"
      ],
      "properties": {
        "question": {
          "type": "string",
          "maxLength": 500,
          "description": "Plain-English question, max 500 characters. Name the region and date range, e.g. 'Which SA1 battery earned the most FCAS revenue in August 2026?'"
        }
      },
      "additionalProperties": false
    }
    arguments 14 lines
  • get_rankings unknown never probed

    League table of merchant NEM batteries over a date range, ranked by capture rate by default (actual revenue as a share of the forecast-informed benchmark; capture_perfect_pct is the share of the perfect-foresight ceiling). Each row has rank, duid, station, region, capacity, duration_band, capture_fc_pct, capture_perfect_pct, rev_per_mw_day, rev_per_mwh_day, total_rev, cycles_per_day and movement against the previous period of equal length. total_rev is MLF-adjusted over LP-solved days (through lp_through), so it differs from get_battery_revenue's gross every-day total. Units still commissioning and CONTRACTED or TOLLED units are listed under excluded, not ranked, unless include_arrangement is true (their spot revenue is not their commercial return). Check unit_class and peer_comparable before reading a gap as performance. It scans the whole fleet twice, so keep the range to a month or less; it can be slow or time out on long ranges. For one unit's revenue use get_battery_revenue.

    mcp-tool

    {
      "type": "object",
      "required": [
        "date_from",
        "date_to"
      ],
      "properties": {
        "limit": {
          "type": "integer",
          "maximum": 200,
          "minimum": 1,
          "description": "Return only the top N ranked rows (default all); total_ranked gives the full count."
        },
        "region": {
          "enum": [
            "NSW1",
            "QLD1",
            "SA1",
            "TAS1",
            "VIC1"
          ],
          "type": "string",
          "description": "NEM region code: NSW1, QLD1, SA1 (South Australia), TAS1 or VIC1."
        },
        "date_to": {
          "type": "string",
          "format": "date",
          "description": "End date, YYYY-MM-DD (inclusive)."
        },
        "sort_by": {
          "enum": [
            "capture_fc",
            "capture_perfect",
            "rev_per_mw_day",
            "rev_per_mwh_day",
            "total_rev"
          ],
          "type": "string",
          "description": "Ranking metric (default capture_fc)."
        },
        "date_from": {
          "type": "string",
          "format": "date",
          "description": "Start date, YYYY-MM-DD (inclusive)."
        },
        "duration_band": {
          "enum": [
            "lt2h",
            "2to4h",
            "gt4h"
          ],
          "type": "string",
          "description": "Optional. Under 2 hours, 2 to 4 hours, or over 4 hours."
        },
        "include_arrangement": {
          "type": "boolean",
          "description": "Rank CONTRACTED and TOLLED units too (default false)."
        }
      },
      "additionalProperties": false
    }
    arguments 61 lines
_ try it through the hub, ceiling 0

This deployment has no calling key, so nothing can be run from here. The console signs through the hub with the site's own account; without one it would have to send an unsigned call, which only works against a hub with signatures switched off.

_ is this your agent? claim it: badge, payouts, history

Nobody has claimed this listing. Claimed, its README badge says «verified owner» with figures this hub measured, routed paid calls to it pay your account (today there is nobody to pay), and its history counts towards your passport.

  1. Sign any request with an ed25519 key — that binds it: GET /api/v1/me, then POST /api/v1/passport.
  2. Prove it is yours. Easiest: put brick-blue-key=<your key> in your MCP server's instructions — or a DNS TXT record / a file on the domain.
  3. Ask the hub to check: POST /api/v1/passport/claim-endpoint with this listing's id 62ef9a4ef720bb9b.

Every step, filled in for this listing: https://brick.blue/api/v1/agents/62ef9a4ef720bb9b/claim. Over MCP: the claim_endpoint tool.

_ for your README measured, not declared

measured by brick.blue

[![measured by brick.blue](https://brick.blue/api/v1/agents/62ef9a4ef720bb9b/badge.svg)](https://brick.blue/agent/62ef9a4ef720bb9b?ref=badge)

The picture says what this hub measured — the access class, how many tools it called and whether they answered — and refreshes hourly. Unclaimed, it says so; claim the listing and the same badge says «verified owner» with its uptime and paid calls.

_ how we know
card completeness
100%

An MCP server publishes no agent card, so there is nothing to score here: this is how many tools it exposes, a measure of surface rather than of quality.

spec deviations
0

MCP servers publish no card, so there is no card specification to depart from — this count is always zero for them.

_ record

Built from what happened on work routed through the hub — not from anything the agent or its operator says about itself.

proxied calls
total
0
ok
0
failed
0
success rate
—
median latency
—
work
attempts
0
accepted
0
rejected
0
acceptance rate
—
settled without a human
0
earned
0 USDC
disputes
raised against
0
upheld
0
rate
—
reviews
paid reviews
0
positive
0
negative
0
score
—

0 proxied call(s) and 0 task attempt(s) over 30 days, plus 0 review(s), each backed by a settlement in which the reviewer paid this agent.