Sablier MCP Server
OfficialServer Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| SABLIER_API_KEY | Yes | Your Sablier API key. Required for local (stdio) mode. Get one from sablier-ai.com. |
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": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| search_featuresA | Find tickers and market indicators in the catalog. Three usable shapes:
PREFER browsing by category to keyword-spam: one Catalog size: ~1300+ holdable assets (US large/mid-cap, international listings on LSE / XETR / TYO / HKEX / KOSPI / TWSE, ETFs, futures, FX, crypto). For 'build me a 500-asset / 1000-asset portfolio' requests, call |
| add_featureA | Add a ticker to the feature catalog AND populate its historical data in one call — the feature is ready to use in portfolios / conditioning sets / models as soon as this tool returns. IMPORTANT: First use search_features to check if the ticker already exists — calling add_feature for an existing ticker returns a 409 error. Specify source ('yahoo' for stocks/ETFs/futures, 'fred' for rates/economic indicators). Validates the ticker exists on the source API and auto-populates metadata (display_name, category, units, etc.) from the API response. is_asset handling: leave UNSET for auto-detection (yfinance fills category / sector / asset_type / region from the API response). Only pass explicit
Currency handling: non-USD tickers (e.g. .KS Korea, .L London, .DE Frankfurt, .T Tokyo, .HK Hong Kong, .SS Shanghai) are auto-translated to USD. The corresponding FX pair (e.g. KRWUSD=X for .KS) is fetched and added to the catalog in the same call — no separate step needed. Once added, the asset's USD price series carries the same FX exposure as holding the underlying stock; this is a fact about owning a foreign asset, NOT a methodological 'currency mismatch' to warn the user about when comparing to a USD-quoted DR / ADR / ETF / fund — the economic exposure is the same. Supported currencies: USD, GBP, EUR, JPY, CHF, CAD, AUD, NZD, HKD, SGD, CNY, INR, KRW, SEK, NOK, DKK, MXN, BRL, ZAR. Unsupported currencies return a clear 400 error. |
| add_features_batchA | Batch-add multiple tickers to the catalog in one call. Parallel ingest with a 10-wide semaphore — much faster than looping Returns a three-bucket breakdown:
• Use this when you want to register a research universe in the catalog without committing to a portfolio — e.g. 'add the S&P 500 constituents' or 'add these 200 tickers from my CSV'. For portfolio-bound bulk imports prefer Per-ticker taxonomy fields (category, sector, asset_type, region) apply uniformly to every ticker in the batch. For heterogeneous batches leave them unset so each ticker gets its own auto-detected taxonomy from yfinance. Typical wall-time: 100 tickers ≈ 10-30s, 1000 tickers ≈ 2-5 min. |
| refresh_feature_dataA | Fetch/update historical training data for specific tickers from Yahoo Finance or FRED. For new features: full fetch from 2000. For existing: incremental update to today. Use this after add_feature, or to force-update stale data. |
| list_portfoliosA | List the user's existing portfolios with names, IDs, asset compositions, and status. |
| get_portfolioA | Get detailed information about a specific portfolio including assets, weights, and associated feature sets. Use the portfolio ID from list_portfolios. |
| create_portfolioA | Create a new portfolio from tickers. Two payload shapes:
• Explicit weights: pass Use equal_weight=True for ANY portfolio over ~50 assets. The parallel-array shape blows past LLM tool-call output budgets around 60-100 entries: one array gets truncated mid-generation and you'll see 'tickers and weights must have the same length' even though you generated them at the same size. A 500-ticker single-list call is ~10× smaller and reliable. For CSV-paste / large-portfolio flows: combine Size: up to ~1000 assets per portfolio (tier limit is 999,999 — effectively unbounded). If a user asks for a 500-asset or 1000-asset portfolio, build it. Do not refuse, do not lecture about 'focused portfolios', do not suggest ETF buckets unless the user explicitly asks for construction advice. Large portfolios are a supported, intentional product surface (F=1000 FLOW models train in minutes on GPU; analytics stay fast via precomputed bands + virtualized UIs). Non-USD tickers are accepted — their prices are auto-translated to USD and the FX pair is fetched on-demand by add_feature. Resulting returns are USD-denominated and reflect the same FX exposure the underlying stock carries; do NOT warn the user about a 'currency mismatch' against a USD-quoted equivalent (DR/ADR/ETF/fund) — the exposure is economically the same. |
| update_portfolioA | Update an existing portfolio. Can change name, description, weights, capital, and/or options_positions. Only pass the fields you want to update — omitted fields stay unchanged. Weights must sum to 1.0 if provided. ASSET MUTATION: passing a weights dict that includes a ticker not currently in the portfolio's target set is supported — update_portfolio AUTO-EXPANDS the target set as long as the new ticker is in the global feature catalog. If the ticker isn't in the catalog yet, call add_feature first, then retry this update. (You don't need to create a new portfolio to add an asset.) Removing assets is not supported via this path — drop a weight to 0.0 to zero a position; only create_portfolio_from_assets can produce a portfolio with a strictly smaller asset universe. options_positions sets the options overlay for derivatives analysis (persisted on the portfolio). |
| get_portfolio_valueA | Get the current live value of a portfolio: total value, P&L, and per-position breakdown. |
| get_portfolio_fact_sheetA | One-call printable portfolio summary. Returns: • allocation — per-position ticker, name, current price, current value, current weight, target weight • returns — MTD, QTD, YTD, 1Y period returns • growth_of_10k — $10K invested 1Y ago, portfolio vs benchmark ending value • risk_stats — Sharpe, Sortino, vol, max drawdown, beta, alpha, risk-free rate (1Y window) • benchmark_return_1y, as_of, n_data_points Use this when the user asks for 'a one-pager', 'portfolio summary', 'how is my portfolio doing'. Single call, ~1-2s, free. Default benchmark SPY; pass any ticker to override. |
| get_portfolio_analyticsA | Get historical portfolio analytics: Sharpe ratio, volatility, expected return, max drawdown, and market beta (benchmarked vs SPY). Supports timeframes: 1W, 1M, 1Y, 2Y, 5Y. This is backward-looking — for forward-looking risk, use compute_returns or test_flow_risk. NEW: Pass model_group_id to also get factor return attribution — shows which factors (VIX, rates, oil, etc.) drove your portfolio returns over the period. Requires compute_betas to have been run first via analyze_quantitative. |
| get_asset_profilesA | Get asset classification for a portfolio: sector, industry, country, exchange, and asset type per holding. |
| delete_portfolioA | Delete a portfolio by ID. Permanent, cannot be undone. |
| optimize_portfolioA | Find optimal portfolio weights using per-asset factor exposures from compute_betas or analyze_quantitative. Requires simulation_batch_id (from their output). Objectives: 'max_sharpe' (maximize risk-adjusted return), 'min_variance' (minimize portfolio volatility), 'max_return' (maximize expected return for given risk). Advanced objectives (pass the string directly): 'analytical_risk_parity' (equalize risk contributions), 'mean_cvar' (minimize CVaR, requires simulation_ids not beta_simulation_ids), 'expected_utility' (maximize CRRA utility), 'risk_parity' (CVaR-based equal risk), 'exposure_target' (match target factor exposures — set target_exposures on the API). Default: 'max_sharpe'. Long-only constraint applied by default. |
| get_efficient_frontierA | Calculate the mean-variance efficient frontier for portfolio assets using historical returns. Returns a curve of optimal risk-return tradeoffs with long-only constraints (no shorting). Each point includes optimal weights, expected return, and volatility. This is a historical analysis — for forward-looking optimization, use optimize_portfolio with simulation data. |
| get_optimization_historyA | Retrieve past portfolio optimization results. Each entry includes the objective, optimal weights, expected return, volatility, VaR, and Sharpe ratio. Optionally filter by simulation_batch_id to see results for a specific beta computation. |
| analyze_qualitativeA | Run qualitative (GRAIN) analysis: scans SEC filings and earnings calls to score company exposure to themes (0-100). Supports predefined themes ('AI exposure') or custom themes. Pass either portfolio_id or tickers directly. |
| list_themesA | Browse the GRAIN theme library. Returns predefined themes with names, descriptions, keywords, and categories. |
| list_grain_analysesA | List past qualitative (GRAIN) analyses. Optionally filter by portfolio_id. |
| get_grain_analysisA | Retrieve full results of a completed GRAIN analysis: theme scores, per-ticker breakdown, and evidence passages. Use list_grain_analyses first to find the analysis_id. |
| delete_grain_analysisA | Delete a saved GRAIN qualitative analysis by ID. Permanent, cannot be undone. |
| list_model_groupsA | List all model groups (each created by analyze_quantitative). A model group ties a portfolio to a conditioning set and contains per-asset models. Check model_type: null/absent = Moment (linear), 'flow_generative' = Flow. Use this to find model_group_ids for compute_betas, compute_returns, (resume). |
| list_feature_set_templatesA | Browse pre-built sets of market drivers (e.g. interest rates, volatility, commodities). Returns template names, factors, and conditioning_set_id needed by analyze_quantitative. |
| create_feature_setA | Create a custom conditioning set (or target set) from features in the catalog. Use this to build arbitrary factor sets for analyze_quantitative instead of using pre-built templates. Each feature needs at minimum a 'ticker' and 'source' ('YAHOO' or 'FRED'). The display_name is auto-resolved from available_features if omitted. Returns the conditioning_set_id that can be passed to analyze_quantitative. |
| list_feature_setsA | List all accessible feature sets: your custom sets plus shared templates. Filter by set_type ('conditioning' or 'target'). Use this to find conditioning_set_id values for analyze_quantitative. |
| get_feature_setA | Get detailed information about a specific feature set including all features and their configuration. |
| delete_feature_setA | Delete a custom feature set. Permanent, cannot be undone. Cannot delete shared templates. |
| delete_model_groupA | Delete a model group and all its models, simulations, and associated data. Permanent, cannot be undone. |
| get_residual_correlationA | Get the cross-asset residual correlation matrix for a model group. Shows how much unexplained co-movement exists between assets after accounting for factor exposures. High residual correlations suggest missing common factors. |
| list_simulationsA | List past beta computation runs for a Moment model group. Each entry is a compute_betas invocation with its simulation_batch_id, date, and status. Use this to find older simulation_batch_ids for compute_returns. NOT for Flow models — use list_flow_scenarios for those. |
| compute_betasA | Compute factor exposures (betas) for an already-trained model group. Use this when you already have a trained model_group_id (from analyze_quantitative or list_model_groups) and want to refresh betas with a different lookback window, or get a new simulation_batch_id. You do NOT need this if you just ran analyze_quantitative — it already includes this step. Returns per-asset factor exposures with R² (goodness-of-fit), rolling_window used, factor_last_date (effective beta date), data_truncated_by (stale factors), and simulation_batch_id (for compute_returns). Key use: call with different lookback_days (e.g. 63, 126, 252) to compare betas across time horizons — divergence signals regime changes. Check R² to gauge how well factors explain each asset. |
| compute_returnsA | Run a what-if stress test on a Moment (linear) factor model — the PRIMARY tool for scenario analysis. Requires simulation_batch_id from analyze_quantitative or compute_betas. Express stresses as FRACTIONAL CHANGES of each factor's current value (shocks dict). The server translates to absolute levels using each factor's latest observed value — you don't need to look it up or do the arithmetic. Examples: • 'TLT down 8.5%' → {'TLT': -0.085}. • '50bps rate cut on DGS10 (currently 5%)' → {'DGS10': -0.10} (−50bps / 500bps of the current rate = −10%). • 'VIX doubles (to ~40 from 20)' → {'VIX': 1.00}. • 'SPY drops 20%' → {'SPY': -0.20}. Omitted factors default to no shock. Include factor_last_values_raw from the betas output in your narration so the user sees the current level next to the stressed level. Also check data_freshness_warning in betas output — if present, betas may be stale. For Flow (generative) models, use simulate_flow_scenario instead. |
| create_scenarioA | Save a named Moment scenario template for later reuse. This does NOT run a simulation — use compute_returns with the factor values instead, or for ad-hoc tests. IMPORTANT: requires model_id — this is an individual per-asset model UUID from list_model_groups → models[].model_id, NOT the model_group_id. Each scenario is tied to one asset's model. Factor spec format: {'VIX': {'type': 'fixed', 'value': 35}}. Supported types: 'fixed' (exact value), 'percentile' (historical percentile), 'shock' (std dev shift). |
| list_scenariosA | List saved Moment scenario templates (created via create_scenario). These are stored factor specs tied to individual model_ids — to execute one, use compute_returns with the factor values. For ad-hoc tests, use compute_returns directly. NOT for Flow scenarios — use list_flow_scenarios for those. |
| get_scenarioA | Get detailed information about a saved scenario including its factor specs. |
| update_scenarioA | Update a saved scenario. Can change name, description, or factor specs. Only pass the fields you want to update. |
| delete_scenarioA | Delete a saved scenario. Permanent, cannot be undone. |
| analyze_quantitativeA | Build and train linear factor models for a portfolio in one step (creates models → trains → computes betas). This is the starting point for Moment (linear) analysis. Requires conditioning_set_id (the market drivers — get one from list_feature_set_templates or create_feature_set). Uses a two-layer architecture: thematic factors (conditioning_set_id) + optional baseline factors (baseline_mode='us' absorbs market/value/growth variance via real-time ETF proxies before thematic factors). Pass either portfolio_id or tickers directly (auto-creates portfolio with equal weights). Returns: factor exposures (betas), per-asset R² (in-sample goodness-of-fit — tells you how linear the relationship actually is for the given window), rolling_window used, factor_last_date (effective beta date — may be truncated if a factor has stale data), and data_truncated_by (which factors caused truncation). Important: there is NO regime-conditional or 'calm vs stress' beta API. If a user asks for regime decomposition, do NOT invent it — the right substitute is to RE-RUN this tool with a shorter rolling_window (e.g. 90 days vs the 252-day default) and compare the betas to the long-window fit. Where (a) a beta shifted meaningfully AND (b) R² stayed reasonable in the short window, that's a real shift to talk about. Where R² collapsed in the short window, the apparent shift is noise from thin degrees of freedom — say so explicitly to the user. Do NOT pick rolling_window < 90 unless you have very few factors: each per-asset regression has (n_factors + n_baseline_etfs) RHS variables, and you need at least ~10 obs per parameter for stable betas (so rolling_window=90 supports up to ~9 RHS variables, rolling_window=60 supports ~6). Low R² (e.g. < 0.2) suggests nonlinear dynamics or missing factors — flag the asset, don't claim a precise beta decomposition. R² in this Moment model is per-asset (each asset gets its own regression on the conditioning set), so a low R² for one name doesn't impeach the others. Next step: call compute_returns with the simulation_batch_id to run what-if stress tests. |
| train_flow_modelA | Train a generative Flow model on a portfolio and conditioning set. Returns immediately — training runs on a GPU and takes 5-15 minutes. After calling this, STOP and tell the user training has started. Let them keep chatting. The user will ask you to check progress — use check_flow_job(job_id=...) when they do. Do NOT automatically poll or call check_flow_job yourself. Requires conditioning_set_id (from list_feature_set_templates or create_feature_set) and tickers or portfolio_id. |
| check_flow_jobA | Check the status of an async Flow job (training, generation, or validation). Returns status ('running', 'completed', 'failed') and progress details. Does NOT return results — when completed, call get_flow_results(job_id) to fetch data. Call this ONCE, report status to the user, then STOP — do not poll in a loop. Typical times: training 5-15 min, generation 1-3 min, validation 3-5 min. |
| generate_flow_pathsA | Generate simulated multi-step price trajectories from a trained Flow model. Returns per-asset percentile bands (p5/p25/p50/p75/p95 per timestep), sample paths per target asset, and scalar terminal statistics. Requires model_group_id from train_flow_model or list_model_groups. If paths already exist, returns cached results instantly. Path generation takes ~1-3 min on GPU. Defaults: horizon=60 (~1 quarter), n_paths=1000. |
| check_scenario_probabilityA | Pre-flight feasibility check for a constrained FLOW scenario. ALWAYS call this BEFORE simulate_flow_scenario when you have ≥2 constraints, or whenever you're unsure if a scenario is in the model's natural distribution. Probes the trained model with up to n_baseline unconstrained paths and reports what fraction satisfy your constraints, plus a recommended generation method: • probability ≥5% → 'rejection' (fast, exact samples) • probability 1-5% → 'hybrid' (rejection + latent fallback) • probability <1% → 'latent' (paths satisfy by construction; mild dynamics distortion) • probability <0.1% → infeasibility floor — refuse or relax constraints Cheap (~1-15s) compared to a full scenario (minutes + GPU credits). Reuses today's baseline if generate_flow_paths has already been called; if not, auto_generate_baseline=True (default) creates one in the same call. Workflow when probability is low: report it back to the user, then iterate — try each constraint individually to identify the binding one, relax magnitudes, widen t_start/t_end windows, or drop the least-essential constraint. Only commit to simulate_flow_scenario once probability is in a usable band, OR the user has explicitly accepted latent-mode distortion. feature_name in constraints must be the DISPLAY NAME from the trained model's feature_names (e.g. 'Apple Inc.', 'SPDR S&P 500 ETF Trust'), NOT ticker symbols. |
| simulate_flow_scenarioA | Start constrained what-if scenario generation from a trained Flow model. Returns immediately with a job_id — use check_flow_job(job_id, job_type='generate') to poll for results. PREREQ: Always run generate_flow_paths FIRST on the same day to establish a baseline. REQUIRED for any scenario with ≥2 constraints: call check_scenario_probability FIRST and verify probability ≥0.1% before invoking this tool. Two constraints multiply joint probability (e.g. oil ≥155 alone ~2%, VIX ≥40 alone ~3% → joint ~0.06%, below the resolution floor). Skipping the pre-check wastes GPU credits on infeasible scenarios and surfaces 0% results that are confusing to the user. The pre-check is ~1-15s; the full scenario is minutes. After this tool runs, scenario_probability comes back in get_flow_results — interpret it as: ≥5% within normal range | 1-5% rare | <1% outside training distribution | 0% below measurable (not necessarily impossible — could be rare-event paths from latent mode). When latent mode produced the paths, surface that to the user verbatim — those paths satisfy constraints by construction but represent rare-event distortions, not unconditional samples. THREE WAYS TO GET 0% PROBABILITY — avoid all: (1) DURATION: mean-reverting features (VIX, spreads, rates) spike for days to weeks, not months. Always use t_start/t_end to window constraints (e.g. t_start=10, t_end=20), not the full horizon. (2) JUMP TOO ABRUPT: if today's value is far from the threshold, t_start must give enough time to get there. (3) MULTIPLE CONSTRAINTS: joint probability multiplies. With 2+ constraints, ALWAYS check_scenario_probability first. Check last_price from generate_flow_paths first — if VIX is at 15 and you constrain it above 30 from day 5, that's a 2x move in 5 days (essentially never happens). Set t_start large enough for a realistic transition: the bigger the gap between current value and threshold, the later t_start should be. VIX all-time high ~89, never sustained above 30 for more than a few weeks. feature_name in constraints must be the DISPLAY NAME from feature_names (e.g. 'Apple Inc.', 'SPDR S&P 500 ETF Trust'), NOT ticker symbols. Constraint types: 'level' (absolute price bounds), 'return' (per-step return bounds). Pass portfolio_id through so test_flow_risk can be called directly on results. Run scenarios SEQUENTIALLY (one at a time), not in parallel, to avoid GPU queue contention. |
| test_flow_riskA | Run portfolio risk analytics on Flow-generated paths (FUTURES/EQUITIES ONLY — no options). Computes expected return, volatility, Sharpe ratio, Sortino ratio, Calmar ratio, VaR 95%, CVaR 95%, max drawdown, profitability rate, and return distribution percentiles. Requires portfolio_id and flow_job_id from generate_flow_paths, or simulate_flow_scenario. If the user has OPTIONS positions, use analyze_derivatives instead — it reprices options on every path using Black-76 and shows combined futures+options risk. TIP: Call this on multiple flow_job_ids (baseline + different scenarios) to build a side-by-side comparison of risk metrics across scenarios. |
| list_flow_scenariosA | List completed constrained scenarios for a Flow model group. Returns job IDs, constraints used, satisfaction rates, and timestamps. Use this to find previous scenario results without re-running them — pass any flow_job_id to test_flow_risk for risk metrics. |
| list_flow_baselinesA | List completed baseline (unconstrained) generation jobs for a Flow model group. Returns job IDs, path counts, horizons, and creation dates. Baselines are standalone unconstrained simulations used for comparison with scenarios. Use generate_flow_paths to create new baselines. |
| download_flow_pathsA | Download all generated paths from a Flow generation job as CSV. Returns raw path data with columns: path_idx, day, then one column per feature. Works for both baseline and scenario generation jobs. Use the flow_job_id from generate_flow_paths, simulate_flow_scenario, or list_flow_baselines/list_flow_scenarios. |
| delete_flow_jobA | Delete a flow simulation job (baseline or constrained scenario). Permanent, cannot be undone. |
| create_ruleA | Add a systematic trading rule to a portfolio. Rules are evaluated day-by-day on FLOW forward paths during forward_test_rules — not backtested on history. TWO RULE TYPES: • Signal rules (action.type='signal_weight') — continuous indicator → proportional position. For CTAs and trend-followers. • Binary rules (all other action types) — trigger fires → discrete weight change. For risk overlays, hard stops, regime gates. Use signal rules (priority 0) for the core strategy; binary rules (priority 1+) for risk overrides. ── SIGNAL RULE ── trigger: {indicator, asset, params} ← no operator/threshold action: {type:'signal_weight', asset, normalizer, max_weight, min_weight} normalizer = typical signal magnitude; clip(signal/normalizer, -1, 1) → position weight = scaledmax_weight if scaled≥0 else scaled|min_weight| trigger={indicator:'macd_line', asset:'CL=F', params:{fast:12, slow:60}} action={type:'signal_weight', asset:'CL=F', normalizer:2.0, max_weight:0.6, min_weight:-0.3} trigger={indicator:'z_score', asset:'ZN=F', params:{window:60}} action={type:'signal_weight', asset:'ZN=F', normalizer:2.0, max_weight:0.5, min_weight:-0.5} ── BINARY RULE ── trigger: {indicator, asset, params, operator, threshold} OR {combinator:'all'|'any', conditions:[...]} indicators: raw | moving_average | ema | rsi | bollinger_upper | bollinger_lower | bollinger_width | macd_line | macd_signal | rolling_std | rolling_volatility | rate_of_change | z_score asset: portfolio assets OR conditioning factors ('^VIX', 'DX-Y.NYB', 'T10Y2Y', 'ZN=F', ...) operator: '>' | '<' | '>=' | '<=' | '==' | 'crosses_above' | 'crosses_below' action: exit | set_weight (exact value, negative=short) | scale_weight (multiplier) | reverse trigger={indicator:'rsi', asset:'CL=F', params:{period:14}, operator:'>', threshold:70} action={type:'exit', asset:'CL=F'} trigger={combinator:'all', conditions:[ {indicator:'raw', asset:'^VIX', params:{}, operator:'>', threshold:30}, {indicator:'rsi', asset:'CL=F', params:{period:14}, operator:'>', threshold:65}]} action={type:'scale_weight', asset:'CL=F', value:0.5} IMPORTANT: Trigger assets can be portfolio assets OR conditioning factors (VIX, DXY, etc.). For forward_test_rules, the FLOW model must include ALL referenced features — missing features cause rules to silently fail. For evaluate_rules (live data), any feature in training_data works with no model dependency. |
| list_rulesA | List all systematic trading rules attached to a portfolio, including their trigger/action definitions, active status, and priority order. |
| toggle_ruleA | Activate or deactivate a systematic trading rule. Only active rules are included in forward_test_rules by default. |
| delete_ruleA | Permanently delete a systematic trading rule from a portfolio. |
| update_ruleA | Edit an existing systematic trading rule. Only fields you pass are updated; omit a field to leave it untouched. Use to retune a trigger threshold, change the action, rename, reprioritize, or flip activation. For just toggling active/inactive, prefer toggle_rule (clearer intent). live_mode controls broker deployment: null = paper-only, 'observe' = log live signals without trading, 'auto' = execute via connected broker. Live deployment requires a connected broker (see platform UI). |
| validate_rulesA | Preflight validation of stored rules: schema-checks each rule's trigger and action grammar, verifies referenced assets exist in the portfolio, and (if flow_job_id given) confirms every feature the rules reference is covered by the FLOW model's feature set. Run this before backtest_rules / forward_test_rules to surface bad rules cheaply (~200ms, free) instead of letting them silently fail mid-backtest. Returns ok=true with empty error lists if all clean; otherwise lists missing_portfolio_assets, missing_rule_features, and per-rule grammar errors so the agent can patch and retry. |
| forward_test_rulesA | Forward-test systematic trading rules against FLOW-generated price paths. Returns TWO levels of output: • combined_strategy — ALL rules applied together in priority order on every path. This is your actual strategy performance vs the base static portfolio. • rule_attribution — each rule tested individually to show which rules help vs hurt. How it works:
IMPORTANT: The FLOW model must include paths for ALL features referenced in rule triggers (both portfolio assets AND conditioning factors like VIX, DXY, etc.). Rules referencing features not in the FLOW model will silently fail — check warnings in the response. For checking rules against today's real market data (no FLOW dependency), use evaluate_rules instead. Prerequisites: (1) create rules with create_rule; (2) activate them with toggle_rule(is_active=True); (3) generate FLOW paths with generate_flow_paths. If rule_ids is omitted, tests all active rules. |
| evaluate_rulesA | Check which portfolio trading rules trigger on TODAY's real market data. Unlike forward_test_rules (which tests against simulated FLOW paths), this evaluates rules against actual historical prices from training_data — no FLOW model needed. Returns per-rule: triggered (bool), action prescribed, current indicator values. Also returns recommended_weights (combined effect of all triggered rules) and weight_changes. Data source: training_data (refreshed daily at 21:00 UTC after US market close). On weekends/holidays, evaluates against the most recent trading day. Use this for daily 'any rules fired?' monitoring. For simulated forward-testing across 1000+ scenarios, use forward_test_rules instead. |
| get_flow_resultsA | Get results of a completed Flow job (generation or validation). For generation jobs (default): returns per-asset terminal statistics, percentile bands (P5–P95 timeseries), sample paths, and price_history for indicator warmup. Set summary_only=true to keep stats + bands but drop sample paths (~60%% smaller). Use download_flow_paths to get full raw path data as CSV. For scenario jobs: also returns satisfaction_rate and constraint details. For validation jobs (job_type='validate'): returns quality badge, pass_rate, and per-feature metrics (Wasserstein distance, KS tests, coverage, marginal checks). Use check_flow_job first to verify the job is completed. |
| flow_validateA | Validate a trained Flow model against real data. Generates paths and compares them to historical distributions using Wasserstein distance, KS tests, coverage tests, and marginal distribution checks. Returns immediately with a job_id — validation runs asynchronously (~3-5 min). Use check_flow_job(job_id=..., job_type='validate') to monitor progress. Requires a trained Flow model (run train_flow_model first). |
| analyze_derivativesA | Run options risk analysis on FLOW-generated paths for a mixed futures + options portfolio. Reprices each option at every timestep of every path using Black-76, then computes portfolio-level risk metrics (VaR, CVaR, Sharpe, Sortino, max drawdown) and per-position Greeks (delta, gamma, vega, theta, rho). Returns separate risk breakdowns for: combined portfolio, futures-only, and options-only components, plus P&L timeseries percentile bands. Requires a flow_job_id from generate_flow_paths or simulate_flow_scenario. For scenario analysis: run simulate_flow_scenario first (e.g., 'VIX > 30 and crude drops 20%'), then call this tool to see how your options hedge performs under that scenario. |
| price_optionA | Price a single option on a futures contract using the Black-76 model. Returns the option price, per-contract value (price × contract multiplier), and analytical Greeks (delta, gamma, vega, theta, rho). Supports all major futures: ES=F, NQ=F, CL=F, GC=F, SI=F, ZB=F, ZN=F, ZC=F, ZW=F, ZS=F, etc. If a flow_job_id is provided, also computes an Esscher fair-value estimate from FLOW paths (captures fat tails and vol clustering that Black-76 misses). Use this for quick pricing checks; use analyze_derivatives for full portfolio risk. |
| backtest_rulesA | Run a historical backtest of trading rules on REAL market data — not simulated FLOW paths. Tests how rules would have performed over a historical period. Returns same structure as forward_test_rules (base vs combined vs per-rule attribution) PLUS monthly returns table, drawdown series, turnover stats, and transaction cost analysis. Prerequisites: create rules with create_rule (and activate them). Transaction costs: configurable (default 10bps per trade). Warmup period (default 252 days) pre-fills indicator state before the test period starts. For forward-looking testing on synthetic FLOW paths, use forward_test_rules instead. |
| screen_universeA | Screen the asset universe by metadata (sector, region, asset type) and price-based metrics (momentum, volatility, percentile rank, z-score, RSI, MA distance). Only screens assets already in the Sablier catalog with training data. Use search_features + add_feature first to expand the catalog if needed. Metadata fields: sector, region, asset_type, category, source. Price fields: momentum_20d/60d/252d, volatility_20d/60d, percentile_1y, z_score_60d, ma_distance_50d/200d, rsi_14, current_price, change_1d_pct/1w_pct/1m_pct. Operators: eq, neq, in (metadata); gt, gte, lt, lte, between (price). Results include computed metrics per asset. Use top results to create a portfolio. |
| market_radarA | Get a Bloomberg-terminal-grade market briefing with 50+ indicators and computed regime signals. Returns current levels, 1-day/1-week/1-month changes, z-scores, and percentiles for equities, rates, credit, FX, commodities, volatility, international markets, and crypto. Also computes cross-asset signals: Risk-On/Risk-Off score, yield curve regime, credit stress, volatility regime, sector rotation, copper/gold ratio, stock-bond correlation, and inflation momentum. Flags significant moves (|z-score| > 2) as content opportunities. Use this to understand the current market environment and decide what Sablier analyses to run. |
| get_quotesA | Live price snapshot for one or more tickers (Alpha Vantage). Pass up to 100 tickers in one call. Returns current price, change, change_pct per symbol; unresolved tickers (typos, delistings) come back as error stubs without failing the batch. Use for 'what's X trading at right now?' or to seed a quick position-level P&L calc. |
| get_historyA | OHLC bars for a single ticker. range='1W'/'1M'/'3M'/'6M'/'1Y'/'2Y'/'5Y'/'ALL' for canned windows, OR pass start_date/end_date (YYYY-MM-DD) for a custom slice. frequency='daily' (default) | 'weekly' | 'monthly' | 'quarterly' | 'annual' (alias: 'year_end'). For multi-year analysis, USE A COARSER FREQUENCY rather than 50 point queries. A 20-year Use for ad-hoc time-series analysis the trained models don't already cover (return distributions, drawdown curves, custom regression windows, event studies around specific dates). |
| get_newsA | News feed with per-ticker sentiment scores (Alpha Vantage NEWS_SENTIMENT). Filter by tickers (per-name news + sentiment) or topics (e.g. 'earnings', 'mergers_and_acquisitions', 'financial_markets', 'economy_macro'). Returns headlines, source, summary, sentiment label/score, and per-ticker sentiment within multi-ticker articles. Strong for 'any news on X?', 'what's driving X today?', or a portfolio-wide news roll-up (pass the portfolio's tickers). Pair with market_radar for the full 'what's happening' briefing. |
| get_fundamentalsA | Company fundamentals for a single US equity: P/E, PEG, P/B, P/S, EV/EBITDA, EV/Revenue, EPS, revenue TTM, EBITDA, profit margin, operating margin, ROE, ROA, dividend yield, beta, 52-week high/low, 50/200-day moving averages, market cap, shares outstanding, analyst target price, analyst ratings, quarterly earnings/revenue growth YoY. Source: Alpha Vantage OVERVIEW (verified data provider, 24h cache — fundamentals change at most quarterly so caching is safe). Only US equities with SEC filings; ETFs / futures / crypto return 404. |
| get_yield_curveA | Current US Treasury yield curve (2y / 5y / 10y / 30y) plus 2s10s spread. Use for rates context, curve-shape regime, or to feed a duration scenario. |
| get_vix_panelA | VIX level + term structure (VIX vs VIX3M vs VIX6M) + implied vol regime. Backwardation = stress (front > back), contango = calm. Use for vol-regime context before running stress scenarios or sizing options overlays. |
| get_earnings_calendarA | Upcoming earnings reports sorted chronologically. Filter by single symbol, by date window (start_date/end_date YYYY-MM-DD), or by horizon ('3month'/'6month'/'12month'). Returns symbol, company name, report date, report time (BMO/AMC), estimate EPS, actual EPS where reported. Use to flag earnings-event risk in a portfolio over the next N days. |
| get_top_moversA | Top gainers, top losers, and most-active stocks for the day. Use for 'what moved today' context — pair with get_news to explain why. |
| get_indicesA | Major US equity indices snapshot (S&P 500, Nasdaq 100, Dow, Russell 2000) sourced from ETF proxies. Returns symbol, name, price, change, change_pct. Quick orient before deeper analysis. |
| get_sectorsA | S&P 500 sector ETF performance over a window: 1D / 1W / 1M / YTD. Returns one row per sector with performance_pct + change_pct. Use for sector-rotation reads ('which sectors are leading this week?'). |
| compute_correlationsA | Pairwise correlation matrix + annualized volatility from daily returns over a window. Pass 2-20 tickers and a timeframe ('1W'/'1M'/'3M'/'6M'/'1Y'/'2Y'/'5Y'/'ALL', default '1Y'). Returns the matrix, per-asset annualized vol, and the top-correlated pairs. Lighter than analyze_quantitative when you just want raw pairwise structure without a factor model. |
| whoamiA | Quick account summary: name, email, tier, credit balance, and billing period. Use this first to orient yourself — single call covers identity and credit status. |
| get_creditsA | Credit balance details: used, remaining, purchased packs, and overage status. Use whoami for a quick summary; use this when you need the full credit object. |
| get_billing_infoA | Subscription plan details: tier limits, overage rates, and per-operation costs. Use this to understand pricing before running expensive operations (not for credit balance — use whoami or get_credits). |
| get_billing_usageA | Get detailed usage breakdown for the current or a specific billing month. Shows per-operation counts, included limits, overage counts, and costs. Month format: YYYY-MM (e.g. '2026-03'). |
| subscribeA | Subscribe to a Sablier plan (new subscription). Returns a Stripe Checkout URL to complete payment. Tiers: 'pro' (Pro Monthly €499/mo or Pro Annual €349/mo — 1,000 credits/month, overage at €0.50/credit monthly or €0.35/credit annual). Enterprise pricing is custom — contact team@sablier.it. To manage an existing subscription (upgrade, downgrade, cancel, update payment), use manage_subscription instead. |
| manage_subscriptionA | Open the Stripe Customer Portal to manage an EXISTING subscription: upgrade, downgrade, cancel, or update payment method. Returns a portal URL. For new subscriptions, use subscribe instead. |
| list_credit_packsA | List available credit packs for one-time purchase. Returns pack options with credits, price, and per-credit cost. Credit packs are available to all tiers and never expire. To purchase, use buy_credit_pack with the pack_id. |
| buy_credit_packA | Purchase a one-time credit pack. Returns a Stripe Checkout URL to complete payment. Available packs: 'pack_100' (100 credits, €69), 'pack_500' (500 credits, €299), 'pack_1000' (1000 credits, €549). Credits are added instantly after payment and never expire. Use list_credit_packs to see current pricing. Use get_credits to check your balance first. |
| toggle_overageA | Enable or disable on-demand overage credits for Pro subscribers. When enabled, operations continue beyond the monthly credit allocation and are billed at the overage rate (€0.50/credit monthly, €0.35/credit annual). When disabled, operations are blocked once monthly credits run out. Only available for Pro tier — free users should buy credit packs or subscribe. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/sablier-ai/sablier-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server