mcp-edf
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| EDF_SITE | No | The home to read, as part of its address (e.g. `LYON`). Required only if the account has several; any read refuses a mismatch. | |
| EDF_DEBUG | No | `1` logs each request to stderr. | |
| EDF_CONFIG | No | A JSON config file with the same settings (`site`, `tokenFile`, …). Defaults to `~/.config/edf/config.json`. | |
| EDF_TIMEOUT_MS | No | Per-request timeout. Default 30000. | |
| EDF_TOKEN_FILE | No | Where the login is stored. Defaults to `~/.config/edf/tokens.json`. | |
| EDF_MAX_RETRIES | No | Retries for 401 / 429 / 5xx. Default 3. | |
| EDF_REFRESH_TOKEN | No | A refresh token from outside. Kept in memory only, so a login made in-session lasts until restart. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| edf_auth_statusA | Whether the server is signed in to EDF, which home it reads (the login picks the account, and an account can hold several homes), when the login was made, and where it is stored. Signed out, returns the steps to sign in. Call this first when a data tool answers signedIn: false. |
| edf_auth_loginA | Sign in to EDF. On macOS this opens the EDF login in a Safari tab and catches the one-time code when EDF redirects back: if Safari is already signed in to EDF it completes in a second or two with nothing to do; otherwise Safari comes forward and the user logs in as usual. The first run triggers macOS's 'allow to control Safari' prompt. Waits up to wait_seconds, then keeps listening in the background for 5 minutes: call edf_auth_status afterwards. Elsewhere, pass redirect_url instead (see that argument). Logging in again replaces the stored login. |
| edf_auth_logoutA | Revoke the stored refresh token at EDF (best effort) and delete it locally. Recoverable by calling edf_auth_login again. |
| edf_get_contractsA | The home's EDF contracts. Electricity: the tariff option (BASE, HPHC for peak/off-peak, TEMPO…), the subscribed power in kVA and EDF's tariff code, as a history of versions, since EDF writes a new one at every price or option change; |
| edf_get_electricity_consumptionA | Electricity used per day or per month, in kWh and in euros, from the Linky meter via EDF Suivi Conso. Each row has the total cost, the daily share of the subscription (standing_charge_eur), and, on a peak/off-peak or Tempo contract, the split by tariff heading. |
| edf_get_electricity_load_curveA | The Linky load curve: energy per 30 minutes (or per hour) as compact rows of [start, kWh, average kW], with the range total and the peak interval. Use it to see when power is drawn (night vs day, a heater, a car charging); use edf_get_electricity_consumption for daily or monthly totals and costs. Paris local times. At most 7 days at 30m, 31 days at 1h, since a single day is 48 rows. The curve only exists if load-curve collection is switched on for the meter (it is on Suivi Conso's hourly view). |
| edf_get_electricity_max_powerA | The highest power drawn each day, in kVA, as [date, max_kva] rows, with the range maximum and the subscribed power of the current contract to compare against. Use it to decide whether the subscription (e.g. 6, 9, 12 kVA) is too high or close to tripping. The meter's history goes back years; this filters it to the range asked. |
| edf_get_gas_consumptionA | Gas used per day or per month from the Gazpar meter via EDF Suivi Conso: kWh, m³, the conversion factor between them, and euros (energy plus the daily share of the subscription). |
| edf_get_weatherA | The weather at the home's weather station, as Suivi Conso shows it beside the consumption: the average outdoor temperature per day (to 0.1 °C) with the sky (sunny, sunny spells, overcast, light rain…), or per month (whole °C). Use it to read consumption against the weather: heating demand follows the temperature, cooling the heat, and a sunny day lowers heating needs. The sky is one coarse label per day; for sunshine hours or solar radiation use an external weather archive. Same Paris-time days as the consumption tools, so rows line up with edf_get_electricity_consumption and edf_get_gas_consumption. |
| edf_compare_yearsA | Each month of a year against the same month of the year before, from EDF's own comparison: kWh and euros both years and the change in %, for electricity or gas. |
| edf_compare_periodsA | Electricity used in one period against a reference period (by default the same dates a year earlier), with EDF's weather verdict: whether the period was warmer, similar or colder than the reference, and whether consumption was higher, similar or lower. Use it to ask "did we use more this summer than last, and was it hotter?". The verdict is qualitative and reads temperature only: the kWh are NOT weather-adjusted, and in summer "colder" just means cooler, which lowers a cooling load rather than raising a heating one. Electricity only; EDF answers FLUID_NOT_SUPPORTED for gas, so use edf_compare_years with energy=gas plus edf_get_weather there. |
| edf_get_usage_breakdownA | EDF's ESTIMATE of where the energy went over the last 12 months, by use (heating, hot water, cooking, fridge and freezer, washing, lighting…), in kWh, euros and %. For electricity it adds EDF's estimate of electric heating per month as [month, kWh, €] rows. This is a model ( |
| edf_requestA | Escape hatch: GET any Suivi Conso API path for this home, returning the raw JSON (cut at 60,000 characters). GET only; the same login and home headers as the other tools. Prefer the dedicated tools: their output is shaped, this one's is not. Paths seen in the Suivi Conso site include /v2/sites/-/elec-price-changes (beginTs, endTs), /v1/sites/-/billing-windows (fluids=ELEC,GAS), /v2/sites/-/elec-tariff-calendars (date=2026-11-11, a bare date), /v1/sites/-/usage-breakdowns (ts, fluid=ELEC|GAS), /v2/sites/-/forecast-consumptions (beginDate, endDate, fluid, strategy=ESTIMATION_AFTER_REAL). |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 13 tools
Each tool targets a distinct resource or analysis: auth lifecycle, contracts, electricity consumption, load curve, max power, gas consumption, weather, two comparison modes, usage breakdown, and a raw escape hatch. The descriptions actively disambiguate the risky pairs (consumption vs load curve vs max power, compare_years vs compare_periods, estimated breakdown vs measured consumption) and frame edf_request as a fallback to be avoided. No two tools appear interchangeable.
All tools share the edf_ prefix with a predictable verb_noun shape, grouped into coherent families (auth_*, get_*, compare_*). The only deviation is edf_request, the generic escape hatch, which reads naturally as a deliberate exception. An agent can guess a tool name from intent.
13 tools is well within the ideal range and each one maps to a real capability (three auth, four electricity reads, gas, weather, two comparisons, breakdown, raw request). Nothing looks like filler or a near-duplicate.
The surface covers the full read-only lifecycle: sign-in/status/sign-out, contract discovery, measured consumption for both energies, power diagnostics, weather context, comparisons, and an escape hatch for anything else. Gaps are minor but real: no tool to list or switch among the multiple homes an account can hold, and billing/invoice or tariff-change data is reachable only through the unstructured edf_request.