Your agents, on the same catalog you use

65 MCP tools across three layers: data, analytics, and narrative. Your AI agent searches 2.8M+ series, runs forecasts, classifies market signals into 16 named contradictions, persists report runs for "what changed" diffs — all by natural language. The analytical narrative lives in the platform, not in the prompt.

MCP Protocol Claude Code 62 Tools Natural Language Forecasting Analytics
CASE STUDY · THE HORMUZ SCENARIO · APRIL 2026 · DEMONSTRATION EDITION

The signal layer composed the regime
from market data alone — before the narrative arrived.

Every contradiction that fired was downstream of a Strait of Hormuz disruption dating to February 28. The platform got the WHAT and HOW MUCH right without knowing the WHY — exactly the division of labor the signal layer was designed for.

supply_shock_signature
VIX-WTI correlation + freight extreme
freight_locked_arb
BWET z = 7.92, spread wide but arb shut
forced_storage_build
Cushing building despite punishing carry
regime_curve_destruction
Backwardation + destroyed roll economics

Platform = WHAT + HOW MUCH. Analyst / IEA / OPEC = WHY. The signal layer does not need to know the cause to flag the regime — and the regime is what trades.

Every published report includes an MCP methodology appendix documenting the exact tools, data sources, and signal-layer stats used to produce it — the product demo in 20 lines, replicable by any MCP client.

Ask your AI assistant

Real conversations with Claude Code connected to EnergyScope via MCP.

Human: Why is the diesel crack so extreme right now? Is this a supply story or a demand story?

[calling: latest(["PET.RDIESELQ.W", "PET.WDIUPUS2.W", ...])]
[calling: crack_spread("diesel")]
[calling: seasonal("PET.WDIUPUS2.W", years=5)]
[calling: derived_signals(metrics={crack_diesel_z: 5.1, distillate_seasonal_pctl: 18, bwet_z: 7.92, m1_m12: -22.6, vix_corr: 0.91, ...})]
active signals: diesel_crack_extreme (1.0, extreme),
distillate_undersupplied (0.9, extreme),
freight_extreme (1.0, extreme),
steep_backwardation (0.94, extreme),
vix_oil_supply_shock (0.82, elevated)
contradictions firing: diesel_clean_long (1.0, dominant_lens),
supply_shock_signature,
regime_curve_destruction
NOT firing: gasoline_overhang, distillate_oversupplied

Agent: Supply, not demand. The platform's classification is unambiguous:
diesel_clean_long is firing at score 1.0 (dominant lens), which requires
diesel_crack_extreme AND excludes distillate_oversupplied. Distillate
stocks are at the 18th seasonal percentile — the opposite of an inventory-led rally.

The key tell is the composition. supply_shock_signature is firing — VIX-WTI
rolling correlation at 0.91, positive — crude is trading like a safe haven, not
a risk asset. That's the textbook 1973-style regime, not a 2008-style demand scare.
In a demand-driven crack rally you'd see distillate_oversupplied firing
simultaneously (refiners running hot but product can't clear). Here you see the
opposite: refiners under-running because they can't source crude.

The WHY the platform can't tell you directly: Middle East refineries that historically
supplied Asian distillate are cut off (Strait of Hormuz closure since Feb 28, per the
IEA April OMR). That's external context — the signal layer had already flagged the supply shock
from the data, before the narrative arrived.
Human: What if the Strait of Hormuz reopens next week? What would we see change first?

[calling: latest(["IEA.OMR_HEADLINE.ME_FLOATING_STORAGE_CHANGE_MB.M", "SHIP.BWET.D", "ICE.BRENT.M1.D", "PET.WCESTUS1.W"])]
[calling: derived_signals(metrics={me_floating_storage_mb: 100, forced_storage_build: active, freight_extreme: z=7.92, steep_backwardation: M1-M12=-22.6, ...})]
current: 9/15 contradictions firing, regime=HORMUZ_CRISIS
virtual metrics: 100 mb floating storage trapped ME Gulf
(all-time high in our dataset)

Agent: Three leading indicators would flip within days, in this order:

First — freight. BWET z-score at 7.92 is structurally elevated ONLY because
tankers can't transit the strait and Cape-of-Good-Hope rerouting adds 2 weeks +
$5-10/bbl. freight_extreme would collapse toward baseline (z → 0) within
3-5 days of reopening, faster than physical barrels actually move.

Second — forced_storage_build. This contradiction is firing because Cushing
is building despite punishing carry (roll yield -32%) — i.e., storage is happening
for non-economic reasons because crude can't leave the US Gulf. Once the export
arb reopens, Cushing draws and the contradiction goes inactive. The signal would
flip before the stocks data even prints.

Third — the snap-back risk. 100 mb of floating storage currently trapped
in the Middle East Gulf is the highest in our dataset. That barrel hits the market
on a single day when the strait opens. Historical reference: 1991 Gulf War reopening
saw Brent fall ~45% in six weeks. The snap-back can be as violent as the squeeze.

What stays firing: diesel_clean_long (global product shortage persists until
refining capacity rebuilds — 4-6 weeks), and opec_iea_spread_widening
(the forecasting disagreement is baked in for 2026).

The asymmetric hedge: short-dated product puts, not crude puts.
Human: What changed since yesterday's morning brief? Anything new firing?

[calling: compare_runs(name="morning", min_pct_change=2)]
signals_added: []
signals_removed: []
signals_intensified:
- freight_extreme: 0.84 → 0.92 (Δ+0.08)
- opec_iea_spread_widening: 0.15 → 0.69
(mild → extreme, Δ+0.53) ⚠
- regime_curve_destruction: 0.86 → 0.92 (Δ+0.06)
contradictions_changed:
- supply_shock_signature: intensifying, 0.78 → 0.86
- forced_storage_build: new_firing (was inactive)
virtual_metrics:
- opec_iea_demand_spread_2026: 1.73 → 2.53 mb/d (record)

Agent: One categorical change and three intensifications.

The categorical change is the OPEC-IEA demand spread. IEA revised 2026
world demand down 730 kb/d in their April OMR this morning — the single largest
monthly revision in our dataset. That flipped opec_iea_spread_widening
from mild (0.15) to extreme (0.69). The two agencies are now 2.53 mb/d
apart on 2026 world demand, the widest divergence we've ever recorded.

One of them is dramatically wrong. If IEA is right, OPEC's production policy is built
on 2.5 mb/d of fantasy demand. If OPEC is right, the crisis resolves faster than the
spread suggests.

forced_storage_build just started firing for the first time this cycle.
Cushing is accumulating despite punishing carry (-32% roll yield) — non-economic
storage, classic supply-pressure tell. This one's worth watching closely: if
forced_storage_build escalates further, the snap-back risk intensifies.

Regime unchanged (HORMUZ_CRISIS) but intensifying, not easing.
Human: Generate me a diesel desk brief as HTML with the current regime, the refining crack story, and the forward look. Publish it.

[calling: report(preset="refining", watchlist="oil_products_daily")]
[calling: derived_signals(metrics={...})]
[calling: compare_runs(name="diesel_brief")]
[calling: save_report_run(name="diesel_brief", html="...", snapshot={...29 keys...}, prompt="Diesel desk brief with regime + crack + forward look", publish=True)]
ok: true
saved: 20260414T153042
published_latest: /reports/diesel_brief.html
bytes: 4821 (full methodology appendix included)

Agent: Done — published at energyscope.io/reports/diesel_brief.html.

The brief is anchored on the diesel_clean_long contradiction (score 1.0,
dominant lens — the cleanest long signal in the complex globally). Refining section
leads with the crack z-score at 5.1 and the fact that distillate_oversupplied
is NOT firing, which is what gives the contradiction its clean read. Forward look ties
to the snap-back tail risk: 100 mb floating storage, reopening scenario flips
forced_storage_build and freight_extreme first.

The HTML includes a full MCP methodology appendix documenting the 30 tool calls,
11 datasets, and the signal/contradiction state used to produce it — any MCP client
calling the same tools with the same watchlist gets the same analysis. The narrative
layer lives in the platform, not in the prompt.

compare_runs() against yesterday's diesel_brief snapshot will
generate the "what changed" section automatically on the next run.
YOUR CLAUDE CODE PROMPT

"Generate a full oil market report as html using the quarterly preset with my oil_daily watchlist. Include seasonal context, curve structure, crack spreads, positioning, and forecasts."

One prompt in Claude Code. 30 MCP tool calls (~8s for data + analytics pull from EnergyScope server), then your Claude Code may take a few minutes to write the full HTML report with KPIs, charts, risk matrix, and tool audit.

See the Report
or browse all 12 example briefs — two regimes →

65 MCP tools

15 data & discovery tools + 41 analytics tools. All available via the Model Context Protocol.

Data & Discovery

search

Search 2.8M series by keyword. Returns series_id, name, units, frequency.

get_data

Fetch time series data. Multiple series, date range filtering.

latest

Latest value for one or more series. Period, value, name, units.

browse

Browse the category tree. Discover data hierarchically.

datasets

List available datasets with row counts and load state.

health

Server status — series count, data rows, connection check.

feedback

Submit bug reports, feature requests, and data gaps. Goes straight to the team with push notification.

list_series

Browse series IDs by dataset or prefix. Grouped by frequency. Feeds directly into correlate_all() and other multi-series tools.

upcoming_events

Catalyst calendar — EIA weekly reports, CFTC COT, Fed FOMC, OPEC MOMR, IEA OMR, NFP, CPI. Days-ahead timing with UTC timestamps.

save_watchlist

Save named baskets of series IDs server-side. Reusable across report(), correlate_all(), changes(), get_data().

get_watchlist / list_watchlists / delete_watchlist

Retrieve, browse, and remove saved watchlists. Analysts track their own custom tickers, invoke tools with watchlist="name".

check_for_updates / whats_new

Compare installed MCP version to latest PyPI release. Show changelog since your installed version. health() also flags updates.

Analytics (41 tools)

forecast

Multi-factor XGBoost forecast. Auto-forecasts predictors with ARIMA + Prophet. Compares both engines.

arima

Univariate auto-ARIMA with confidence intervals. Reports model order and AIC.

prophet

Facebook Prophet with holidays, seasonality, changepoints. Trend decomposition.

theta

Theta method — M3 competition winner. Fast, robust benchmark forecast.

smooth

Exponential smoothing (single, double, Holt-Winters, ETS auto) with forecast.

breakpoints

Structural break detection. Regime changes with dates, shift magnitudes, segment means.

stats

Descriptive statistics — mean, median, stdev, skewness, kurtosis, percentiles.

volatility

Rolling + GARCH(1,1) conditional volatility, annualised.

returns

Log returns, cumulative returns, max drawdown with peak/trough dates.

correlation

Pairwise Pearson correlation matrix, aligned on common periods.

unit_root

Stationarity tests (ADF, KPSS, Phillips-Perron) with consensus.

cointegration

Johansen or Engle-Granger cointegration test with trace statistics.

var

Vector Autoregression with impulse response functions and Granger causality.

acf

Autocorrelation, partial autocorrelation, and Ljung-Box Q-statistics.

transform

Diff, pct, log, logdiff, lag, moving average, EMA, cumsum, z-score.

hp_filter

Boosted Hodrick-Prescott filter — trend vs cycle decomposition.

bandpass

Band-pass filter (Baxter-King / Christiano-Fitzgerald) for cycle extraction.

seasonality

Seasonal decomposition — trend, seasonal, and residual components.

interpolate

Fill missing values — linear, log-linear, spline, cardinal interpolation.

outliers

Outlier detection — Z-score, IQR, or Isolation Forest.

elastic_net

Elastic net regression with variable selection and coefficient ranking.

quantile_reg

Quantile autoregression — conditional quantile estimates for tail risk.

bubble_test

GSADF test for explosive bubbles with episode start/end dates. Feeds the bubble_detected derived signal via bubble_gsadf_excess snapshot key (WISH-59a, 2026-04-14).

lpirf

Local Projection Impulse Response — non-parametric IRF (Jordà 2005).

midas

MIDAS mixed-frequency volatility — daily returns to forecast monthly vol.

spread

Pair spread with z-score, percentile, half-life (mean reversion), rolling z-score.

rolling_correlation

Rolling Pearson correlation with configurable window. Tracks regime shifts in co-movement.

crack_spread

Refining margins — 3-2-1, gasoline, diesel. Defaults to WTI / Gulf gasoline / NY heating oil.

changes

Detect significant changes — period-over-period diff, ranked by z-score, flags outliers.

snd_balance

Supply & Demand balance model — supply, demand, Theta forecasts, pinned scenarios, implied stock change.

chart

ASCII sparkline chart for quick visualisation in-chat. Min, max, current, range.

report

Meta-tool with presets: trader / analyst / daily / deep. Bundles spreads, cracks, curves, positioning, seasonal, forecast.

percentile

Rank any value within the series' own history. Z-score, percentile, quartile breakdown (p5/p25/p50/p75/p95).

seasonal

Current value vs N-year same-week/month average. Delta, z-score, range position — essential for commodity analysis.

term_structure

Futures curve analytics — contango/backwardation, calendar spreads, roll yield. Reads M1–M12 rolls.

maintenance_signal

Detect likely refinery turnaround weeks from utilization drops vs trailing trend. Clusters consecutive flagged weeks into events. Feeds the maintenance_detected derived signal via maintenance_trough_z snapshot key (WISH-59a, 2026-04-14).

correlate_all

Scan many candidates against a target, rank by rolling correlation. "What tracks WTI best lately?" Discovery → analysis in one call. Automatically runs inside report(preset='quarterly'|'deep'|'regime'|'analyst'|'macro') — the macro correlation matrix against MACRO.* candidates, 60d rolling vs target (WISH-59b, 2026-04-14).

arb_signal

Unified crude arb score (−2 to +2) combining Brent-WTI spread + tanker freight + ICE.BRENT curve shape. Extremes surfaced as alerts.

forecast_ensemble

Theta + ARIMA + Prophet side-by-side with min/median/max/spread. Flags model AGREEMENT vs DISAGREEMENT — when methods disagree, the disagreement IS the finding.

Narrative Layer (6 tools) — NEW

The analytical narrative now lives in the platform, not in the prompt. Same dataset, different desk lenses, coherent house view across all reports.

derived_signals

Classify a metrics dict into 53 named oil-market signals across 7 themes (crude_supply, refined_products, market_structure, positioning, macro, european, opec_compliance) that compose into 16 trade-thesis contradictions — including the 9 original US headlines (refiner_margin_trap, freight_locked_arb, fundamental_rally, regime_curve_destruction, forced_storage_build, supply_shock_signature, diesel_clean_long, gasoline_overhang) plus 6 cross-Atlantic contradictions (arb_shut_but_eu_drawing, rotterdam_squeeze, global_stocks_tight, opec_revision_vs_price, ...). Each signal returns a scored 0–1 intensity with severity bucket (mild/elevated/extreme) and a rendered trigger sentence. Pass prev_metrics for transition-aware classification (new_firing, intensifying, easing). Contradictions ARE the report headlines. 59 input key aliases tolerated. schema=True for catalog introspection.

save_report_run

Persist a report run with HTML output, key-metric snapshot, and the prompt used. Per-user storage. Tomorrow's report can reference today's snapshot to narrate "what changed".

previous_report

Retrieve a previous report run — HTML, snapshot, prompt, timestamp. Read yesterday's emphasis before generating today's, then anchor the new report on what shifted.

compare_runs

Structured diff between two report runs. Numeric deltas (abs + pct), categorical before/after, plus signal diff (signals_added/removed, contradictions_added/removed). Regime-shift detection in one tool call. The "Changes Since Last Brief" section writes itself.

list_report_runs

Browse saved reports per user. Or list all timestamps for a specific report.

get_instructions

Server-side MCP catalog. The agent fetches its own dataset list and key series on connect — new datasets show up immediately, no PyPI release needed.

Signal & contradiction catalog

53 named oil-market signals (organized into 7 themes) compose into 16 trade-thesis contradictions — 9 US and 6 cross-Atlantic. The contradictions ARE the report headlines. Same data, 9 different desk lenses, coherent house view.

How it works: Pass a flat metrics dict to derived_signals() — get back which signals are firing and which contradictions activate. Pass two snapshots to compare_runs() — get back which signals/contradictions appeared/disappeared between runs (regime-shift detection in one tool call). Thresholds and definitions live server-side; tune without a client release.

Signal layer v2 — five upgrades beyond boolean firing

The v2 narrative layer powers the Hormuz case study above. Every capability here feeds into the same derived_signals() call — pass a metrics dict, get back scored intensities, severity labels, theme summaries, virtual composites, and transition diffs against the previous run.

SCORED

0–1 intensity, not a boolean

Every signal past its threshold returns a 0–1 score. "Firing" is a question of degree — the agent can rank severity across the whole firing set, not just count them.

SEVERITY BUCKET

mild / elevated / extreme

Scores bin into three severity labels the report can cite directly. "freight extreme at z=7.92 → extreme" writes itself.

7 THEMES

Theme summary banner

Signals group into crude_supply, refined_products, market_structure, positioning, macro, european, opec_compliance. Each theme gets a one-line banner — the report scaffold falls out of this structure.

VIRTUAL METRICS

Auto-computed cross-dataset composites

Metrics like the OPEC-IEA demand spread or US-EU stock ratio are computed on the server from the raw snapshot — agents never need to assemble them. Same inputs, same numbers, every run.

HISTORY TRANSITIONS

prev_metrics → new_firing / intensifying / easing

Pass yesterday's metrics alongside today's. The classifier labels each firing signal as new_firing, intensifying, or easing — regime-shift detection without a client-side diff.

Signals (53) — selected foundational signals shown; call derived_signals(schema=True) for the full catalog

GroupSignalPredicate
Crackscrack_extreme3-2-1 crack z > 3
diesel_crack_extremediesel crack z > 3
gasoline_crack_extremegasoline crack z > 3
Inventoriesgasoline_oversuppliedgasoline seasonal pctl > 90
gasoline_undersuppliedgasoline seasonal pctl < 20
distillate_oversupplieddistillate seasonal pctl > 90
distillate_undersupplieddistillate seasonal pctl < 20
crude_oversuppliedcrude seasonal pctl > 80
crude_undersuppliedcrude seasonal pctl < 20
Cushingcushing_fullcushing z > 2
cushing_tightcushing z < -2
cushing_building_fastcushing 7d pct > 5%
Productionproduction_at_seasonal_highproduction seasonal pctl ≥ 99
Curvesteep_backwardationM1−M12 < -$10
steep_contangoM1−M12 > +$5
punishing_carryroll yield < -30%
Freightfreight_extremeBWET z > 3
freight_collapsedBWET z < -2
Spreadspread_wideBrent−WTI z > 2
spread_invertedBrent < WTI
Refineryrefinery_strongrefinery util > 92%
refinery_weakrefinery util < 85%
Positioningwti_specs_extendedWTI MM pctl > 90
wti_specs_shortWTI MM pctl < 10
wti_positioning_median30 ≤ WTI MM pctl ≤ 70
brent_specs_extendedBrent MM pctl > 90
brent_specs_shortBrent MM pctl < 10
brent_positioning_median30 ≤ Brent MM pctl ≤ 70
Macrovix_oil_supply_shockVIX-WTI rolling correlation > 0.5
Europeaneu_oil_stocks_tightEU27 oil seasonal pctl < 20
eu_gas_stocks_tightEU27 gas seasonal pctl < 20
nl_stocks_tightNetherlands oil seasonal pctl < 20
eu_oil_imports_surgingEU27 oil imports 3m pct > +15%
OPEC complianceopec_compliance_gap_extrememax direct-vs-secondary gap > 200 tb/d
opec_iea_spread_wideningOPEC-IEA 2026 demand spread > 1.5 mb/d
opec_demand_downgradedOPEC world demand MoM revision < -0.3 mb/d
Weatherweather_cold_extremeHDD anomaly z > 2
weather_hot_extremeCDD anomaly z > 2
weather_mild_winterHDD anomaly z < -2
New (2026-04-14)maintenance_detectedrefinery runs trough z < -2
bubble_detectedGSADF test exceeds critical value

Contradictions (16) — these ARE the report headlines

Each contradiction composes positive named signals (no negation tricks). When multiple fire simultaneously, dominant_lens picks the most extreme one based on underlying signal magnitudes.

★ refiner_margin_trap

crack_extreme + gasoline_oversupplied
Cracks at extremes while gasoline stocks are oversupplied — refiner margin compression risk.

★ diesel_clean_long

diesel_crack_extreme (excludes distillate_oversupplied)
Diesel crack extreme without inventory overhang — cleanest long signal in the complex.

★ gasoline_overhang

gasoline_oversupplied + gasoline_crack_extreme
Both crack and inventories at extremes — false-signal risk on gasoline length.

★ forced_storage_build

punishing_carry + cushing_building_fast
Cushing building despite punishing carry — non-economic storage, supply pressure.

★ freight_locked_arb

spread_wide + freight_extreme
Spread wide while freight sits at an extreme — a wide spread with expensive shipping may not be an executable arb. Compares z-scores, not $/bbl economics.

★ fundamental_rally

spread_wide + wti_positioning_median
Prices at extremes but spec positioning at median — rally is fundamental, not crowded, no unwind risk.

★ supply_shock_signature

vix_oil_supply_shock + freight_extreme
VIX and oil correlated positively + freight extreme — the pattern associated with supply-side shocks rather than demand panic. A pattern match, not an identification.

★ regime_curve_destruction

steep_backwardation + punishing_carry
Backwardation steep, roll yield punishing — storage economics destroyed.

Cross-Atlantic contradictions (6) — the European half of the narrative layer

Added to capture the EU / US divergences that surface when derived_signals() runs against a cross-Atlantic snapshot. Compose US signals with EUROSTAT + national-level EU series.

★ arb_shut_but_eu_drawing

freight_extreme + spread_wide + eu_oil_stocks_tight
Physical arb shut while European inventories are draining. Pain point for the EU trader — watch for the spread to break.

★ rotterdam_squeeze

nl_stocks_tight + freight_extreme
Netherlands (Rotterdam/ARA hub) tight + freight extreme — ARA squeeze, watch the physical premium.

★ global_stocks_tight

crude_undersupplied + eu_oil_stocks_tight
US and EU stocks both in the bottom fifth of their seasonal ranges — a wider arb cannot relieve one from the other. Not tested: freight, actual flows, flat price.

★ us_comfortable_eu_tight

eu_oil_stocks_tight + crude_oversupplied
EU stocks in the bottom fifth of their range while US crude sits in the top fifth — an Atlantic divergence that historically argues for a wider Brent-WTI. Levels only; says nothing about why the sides differ.

★ eu_comfortable_us_tight

crude_undersupplied + eu_oil_stocks_comfortable
The reverse divergence — US crude tight while EU is comfortable; historically a Brent-WTI compressor.

★ flow_freight_divergence

eu_oil_imports_declining − freight_collapsed
EU imports falling without the cheap shipping a demand-driven slowdown usually brings. The exclusion leg has never fired on the live convention, so it currently adds no information — the narrative says so.

Meta-signals: when the contradiction set itself is meaningful, derived_signals() surfaces composition-level patterns:

Data, analytics, narrative

Three layers, all server-side. The analytical narrative lives in the platform, not in the prompt.

📊 Data

2.8M energy series, 21 datasets, sub-200ms response. Arrow Flight transport.

🧮 Analytics

41 server-side tools — forecasts, spreads, cracks, volatility, breakpoints, term structure, seasonal context. Your analytics where the data sits.

📰 Narrative

53 named market signals (7 themes) + 16 trade-thesis contradictions (9 US + 6 cross-Atlantic). Scored intensity, history-aware transitions, cross-dataset virtual metrics. Report run storage with snapshot diffs. Same data, different desks, coherent house view. Bloomberg-style commentary writes itself.

One command setup

No installation needed. uvx downloads and runs the MCP server automatically.

claude mcp add energyscope -e ENERGYSCOPE_SERVER=grpc+tls://data.energyscope.io:443 -e ENERGYSCOPE_API_KEY=your-api-key -- uvx energyscope-mcp

That's it. Start a new Claude Code session and ask about energy data.

Alternative: pip install energyscope-mcp then claude mcp add energyscope -- energyscope-mcp

Requires Python 3.10+ and uv (for uvx). Works with Claude Code, Claude Desktop, or any MCP-compatible client. View on PyPI →

What your agent can do

You askAgent does
"What's happening with WTI?"Calls latest + breakpoints + volatility. Gives price, recent regime changes, and current vol.
"Forecast crude stocks for next month"Calls prophet with US holidays on PET.WCESTUS1.W. Returns forecast + confidence bands.
"Which series predict WTI best?"Calls forecast with multiple predictors. Reports R², feature importances, and ranked coefficients.
"Is there a bubble in natural gas?"Searches for NG price series, runs unit_root + checks via analytics. Reports stationarity and any explosive episodes.
"Compare all forecasting engines on WTI"Runs arima, prophet, theta, forecast (XGBoost). Compares RMSE side by side.
"Build me an S&D balance for US crude"Searches for stocks, production, imports, demand series. Gets latest + forecasts for each. Assembles supply/demand/balance view.

Connect your AI agent

Sign up for an API key. Install the MCP server. Your AI assistant gets 2.8M energy series + 65 MCP tools across data, analytics, and narrative layers.

Sign Up Free

Excel Add-in · Forecasting · Workflows · Demo Report · Data Coverage · Contact