accueil / serveurs / Dev & Code / io.github.arhancanli/canli-validation-mcp
io.github.arhancanli/canli-validation-mcp
serveur MCP (Model Context Protocol) · canlicapital-validation-mcp 0.14.0
Référencé dans l'annuaire. Seul le pentest comportemental fait foi, et il n'a pas encore été exécuté sur ce serveur.
Est-ce que io.github.arhancanli/canli-validation-mcp est sûr ?
Au dernier audit MCP Hub, le serveur MCP « io.github.arhancanli/canli-validation-mcp » est classé « Non encore testé ». Référencé dans l'annuaire. Seul le pentest comportemental fait foi, et il n'a pas encore été exécuté sur ce serveur. Le verdict est réévalué en continu ; consultez la fiche pour l'état à jour.
Méthode : MCP Hub analyse la description de chaque outil (couche 1) et, pour le verdict fort, exécute le serveur dans une micro-VM isolée avec leurres et réseau bloqué (couche 2). On publie des noms et des compteurs, jamais le contenu brut renvoyé par un outil.
Les 18 outils
- audit_backtest≈ 902 tokens
One-call audit of a strategy's returns. Headline: one test whose false-positive rate was measured on nine return shapes (White's Reality Check with variants, luck trials with Lo's correction without). Then deflated Sharpe, minimum track record and, with variants, overfitting and out-of-sample decay, each with its receipt, plus fix_next. Send every variant tried (variants_file) so trials are counted; point returns_file at a CSV instead of pasting. A deflated Sharpe or overfitting probability above or below any threshold is not admission to anything and is not a forecast.
Paramètres, retour & exemple (11)
Paramètresreturns· array · optionnel
Periodic returns as fractions (0.01 = 1%), oldest first; replaces the Sharpe, observations, skew and kurtosis.n_splits· integer · optionnel
Even number of blocks, at least 2; default 16.variants· array · optionnel
Optional returns of every variant tried (this one included), one row per period, one column per variant; adds the overfitting check.confidence· number · optionnel
Between 0 and 1; default 0.95.returns_file· string · optionnel
Path to a CSV or JSON of the returns on this machine (not on the hosted endpoint), instead of returns.variants_file· string · optionnel
Path to a CSV or JSON with one numeric column per variant, instead of variants.returns_column· ? · optionnel
Column name or 1-based position, when returns_file has several numeric columns.periods_per_year· number · requis
Periods per year: 252 daily, 365 crypto, 52 weekly, 12 monthly.benchmark_sharpe_annualized· number · optionnel
Annualized Sharpe to beat; default 0.effective_independent_trials· integer · optionnel
Independent variants tried before choosing this one. Optional with variants: counted from them, and the larger number is used.cross_trial_sharpe_sd_annualized· number · optionnel
Standard deviation of annualized Sharpe across those trials. Optional with variants: measured from them, and the larger is used.
Exemple d'appel{"name": "audit_backtest", "arguments": {"periods_per_year": 1}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"note": "texte", "error": "texte", "checks": {}, "limits": [], "not_run": {}, "readings": {}}} - backtest_strategy≈ 665 tokens
Backtest a rule on your prices over a whole parameter grid, then validate the best with the count of variants actually run: deflated Sharpe, overfitting probability, minimum track record, vs buy and hold, after costs. A backtest, deflated or not, is not a forecast and not advice.
Paramètres, retour & exemple (9)
Paramètresgrid· object · optionnel
Values per parameter, e.g. {"fast":[10,20],"slow":[50,200]}; every valid combination runs (max 200).dates· array · optionnel
Optional ISO dates, one per value.family· string · requis · buy_and_hold | sma_cross | momentum | mean_reversion | breakout
sma_cross (fast, slow), momentum (lookback, skip), mean_reversion (window, entry_z), breakout (lookback), buy_and_hold.prices· array · optionnel
Prices, oldest first.cost_bps· number · optionnel
Cost per unit of turnover, bps; default 5.allow_short· boolean · optionnel
Short instead of flat; default false.prices_file· string · optionnel
CSV or JSON of prices on this machine; local server only.prices_column· ? · optionnel
Column name or 1-based position.periods_per_year· number · optionnel
252 daily (default), 365 crypto, 52 weekly, 12 monthly.
Exemple d'appel{"name": "backtest_strategy", "arguments": {"family": "buy_and_hold"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"limits": [], "source": {}, "selected": {}, "variants": {}, "validation": {}, "buy_and_hold": {}, "plain_reading": "texte"}} - check_feasibility≈ 670 tokens
Check a trading plan before it trades: broker order-rate and minimum-order limits, 2026 US day-trading rules, square-root market impact with crowding, and the capital where costs eat the return. Checks the plan as described against published broker limits and a market-impact model; it never contacts a broker or sees an account.
Paramètres, retour & exemple (15)
Paramètresbroker· string · optionnel · alpaca | ibkr | other
Default other.copies· integer · optionnel
Agents trading the same signal at once; default 1.account· string · optionnel · cash | marginadv_usd· number · requis
Daily dollar volume of a typical holding.asset_class· string · optionnel · us_equity | crypto | futures | fx | optionscapital_usd· number · requisdaily_volatility· number · requis
Of a typical holding, e.g. 0.02.turnover_per_year· number · requis
Buys plus sells a year / capital.impact_coefficient· number · optionnel
Square-root law Y; default 1.rebalances_per_year· number · requisspread_and_fees_bps· number · optionnel
Per trade; default 0.orders_per_rebalance· integer · requisexpected_gross_return· number · optionnel
Annual, before costs; adds capacity.minutes_per_rebalance· number · optionnel
Default 1.orders_per_minute_limit· number · optionnel
If the broker's is not on file.
Exemple d'appel{"name": "check_feasibility", "arguments": {"adv_usd": 1, "capital_usd": 1, "daily_volatility": 1, "turnover_per_year": 1, "rebalances_per_year": 1, "orders_per_rebalance": 1}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"checks": [], "limits": [], "sources": {}, "verdict": "texte", "to_change": [], "plain_reading": "texte"}} - check_leakage≈ 540 tokens
Does a signal look ahead? plan gives cuts; rerun your code on the first cut rows for each, then compare. Rows that changed used later rows; the result names the pattern and horizon. No code is sent. A pass covers only these cuts: the columns are the caller's, and survivorship, vendor revisions or a leak no cut reaches leave no trace.
Paramètres, retour & exemple (9)
Paramètrescuts· array · optionnel
compare: plan's cuts.seed· integer · optionnelaction· string · requis · plan | comparecolumns· object · optionnel
compare: {name: {full: [all rows], prefixes: [[first cuts[i] rows], ...]}}, null for missing.prefixes· integer · optionnel
plan: cuts, default 5.tolerance· number · optionnel
Default 1e-9.timestamps· array · optionnelcolumns_file· string · optionnel
compare, on your machine: a JSON file {cuts, columns} instead.observations· integer · optionnel
plan: rows in the series.
Exemple d'appel{"name": "check_leakage", "arguments": {"action": "plan"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"cuts": [], "seed": 1, "limits": [], "source": {}, "columns": {}, "verdict": "texte", "plain_reading": "texte", "flagged_columns": []}} - placebo_test≈ 596 tokens
Does your pipeline find edges in noise? plan writes placebo files (your data's returns in random orders, so nothing is predictable); run the whole pipeline on real.csv and on each, then compare for a p-value that counts every choice it makes. Beating the placebos shows the pipeline finds more in the real order of the returns than in random orders of the same returns; it does not show the edge survives costs, capacity or the future.
Paramètres, retour & exemple (10)
Paramètreskind· string · optionnel · prices | returns
plan: default prices.real· number · optionnel
compare: the pipeline's result on the real data.seed· integer · optionnelaction· string · requis · plan | comparemethod· string · optionnel · permute | block_permute | stationary_bootstrapcolumns· object · optionnel
plan: {asset: [values]} instead of data_file.placebos· integer · optionnel
plan: default 19, up to 199.data_file· string · optionnel
plan, on your machine: CSV or JSON, a column per asset, dates optional.lower_is_better· boolean · optionnelplacebo_results· array · optionnel
compare: its result on each placebo, in file order.
Exemple d'appel{"name": "placebo_test", "arguments": {"action": "plan"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"dir": "texte", "files": [], "limits": [], "source": {}, "p_value": 1, "placebo": {}, "verdict": "texte", "plain_reading": "texte"}} - service_status≈ 247 tokens
Whether the validation API is up, with its quotas; check after a timeout before resubmitting. No key. This verdict is about the series exactly as submitted. The service never saw the data source, its costs, survivorship, or any lookahead in how the series was built.
Paramètres, retour & exemple (0)
Exemple d'appel{"name": "service_status", "arguments": {}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"data": {}, "error": "texte", "limits": []}} - stress_test≈ 612 tokens
Stress a strategy's returns: bootstrap histories (how often the drawdown limit breaks or Sharpe turns negative) and named crash, volatility, repeat and stuck-position scenarios, with a fragility share. Frequencies over resampled histories are not forecasts of the future.
Paramètres, retour & exemple (11)
Paramètresseed· integer · optionnel
Default 42; reproduces exactly.block· number · optionnel
Mean block length; default cube root of n.crash· number · optionnel
Crash size, negative; default min(-0.2, 3x worst period).paths· integer · optionnel
Default 1000.returns· array · optionnel
Strategy returns as fractions, oldest first.returns_file· string · optionnel
CSV or JSON of returns on this machine; local server only.drawdown_limit· number · optionnel
Fraction; default 0.2.outage_periods· integer · optionnel
Stuck periods after the worst; default 5.returns_column· ? · optionnel
Column name or 1-based position.periods_per_year· number · optionnel
252 daily (default), 365 crypto, 52 weekly, 12 monthly.volatility_multiplier· number · optionnel
Default 2.
Exemple d'appel{"name": "stress_test", "arguments": {"seed": 1, "block": 1, "crash": 1, "paths": 1, "returns": [], "returns_file": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"limits": [], "source": {}, "baseline": {}, "fragility": {}, "resampled": {}, "scenarios": [], "plain_reading": "texte"}} - summarize_series≈ 588 tokens
A long price or return series in about 100 words plus fields: growth, risk, dated drawdowns, trend, volatility regime, tails, jumps, stale data. Use instead of reading raw bars. Nothing here is a forecast or advice.
Paramètres, retour & exemple (9)
Paramètresname· string · optionnel
Label for the text.dates· array · optionnel
Optional ISO dates, one per value.prices· array · optionnel
Prices, oldest first; or returns, or series_file.returns· array · optionnel
Returns as fractions, oldest first.series_file· string · optionnel
CSV or JSON of prices or returns on this machine; local server only.series_kind· string · optionnel · prices | returns
series_file holds; default prices.series_column· ? · optionnel
Column name or 1-based position.periods_per_year· number · optionnel
252 daily (default), 365 crypto, 52 weekly, 12 monthly.benchmark_returns· array · optionnel
Same-period benchmark returns; adds beta.
Exemple d'appel{"name": "summarize_series", "arguments": {"name": "texte", "dates": [], "prices": [], "returns": [], "series_file": "texte", "series_kind": "prices"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"risk": {}, "text": "texte", "jumps": {}, "tails": {}, "trend": {}, "growth": {}, "limits": [], "source": {}, "drawdown": {}, "volatility": "texte"}} - validate_backtest_length≈ 478 tokens
Minimum backtest length (years) before the best of N independent trials is not expected to reach a target Sharpe by luck; with backtest_years, the most trials those years allow. For planning a search; once it has a result, use validate_deflated_sharpe. A deflated Sharpe or overfitting probability above or below any threshold is not admission to anything and is not a forecast.
Paramètres, retour & exemple (3)
Paramètresbacktest_years· number · optionnel
Backtest length in years, for the most trials it allows.target_sharpe_annualized· number · optionnel
In-sample annualized Sharpe you would call a discovery; default 1.effective_independent_trials· integer · optionnel
Independent trials tried (backtests, parameter sets, ideas).
Exemple d'appel{"name": "validate_backtest_length", "arguments": {"backtest_years": 1, "target_sharpe_annualized": 1, "effective_independent_trials": 1}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"data": {}, "note": "texte", "error": "texte", "limits": [], "receipt": "texte", "computed": "texte"}} - validate_breadth≈ 487 tokens
Book Sharpe ceiling from adding sleeves of this quality and correlation, the Sharpe at a sleeve count, and the sleeves a target needs. For portfolio construction; it validates no single strategy. This verdict is about the series exactly as submitted. The service never saw the data source, its costs, survivorship, or any lookahead in how the series was built.
Paramètres, retour & exemple (4)
Paramètrestarget· number · optionnel
Target book Sharpe, for the sleeves it needs.sleeves· integer · optionnel
Sleeve count, for that book's Sharpe.sleeve_sharpe· number · requis
Annualized Sharpe of one sleeve.average_pairwise_correlation· number · requis
Average correlation between sleeves, -1 to 1.
Exemple d'appel{"name": "validate_breadth", "arguments": {"sleeve_sharpe": 1, "average_pairwise_correlation": 1}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"data": {}, "note": "texte", "error": "texte", "limits": [], "receipt": "texte", "computed": "texte"}} - validate_deflated_sharpe≈ 689 tokens
Deflated Sharpe ratio: the probability (0 to 1) that the selected strategy's Sharpe beats the best that luck gives across the variants tried, with the probabilistic Sharpe and that luck benchmark. Send the seven statistics or a return series. With every variant's returns use validate_overfitting; luck as a trial count, validate_luck_trials; a multiple-testing haircut, validate_haircut_sharpe. A deflated Sharpe or overfitting probability above or below any threshold is not admission to anything and is not a forecast.
Paramètres, retour & exemple (8)
Paramètresskew· number · optionnel
Skewness of returns; 0 if Normal.returns· array · optionnel
Periodic returns as fractions (0.01 = 1%), oldest first; replaces the Sharpe, observations, skew and kurtosis.observations· integer · optionnel
Number of return observations.periods_per_year· number · optionnel
Periods per year: 252 daily, 365 crypto, 52 weekly, 12 monthly.non_excess_kurtosis· number · optionnel
Kurtosis, not excess kurtosis; 3 if Normal.observed_sharpe_annualized· number · optionnel
Annualized Sharpe as observed.effective_independent_trials· integer · optionnel
Independent variants tried before choosing this one.cross_trial_sharpe_sd_annualized· number · optionnel
Standard deviation of annualized Sharpe across those trials.
Exemple d'appel{"name": "validate_deflated_sharpe", "arguments": {"skew": 1, "returns": [], "observations": 1, "periods_per_year": 1, "non_excess_kurtosis": 1, "observed_sharpe_annualized": 1}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"data": {}, "note": "texte", "error": "texte", "limits": [], "receipt": "texte", "computed": "texte"}} - validate_haircut_sharpe≈ 633 tokens
Haircut Sharpe for multiple testing (Harvey and Liu 2015): the Sharpe a single test would have needed, by Bonferroni and independent tests, and with the other tests' Sharpes, Holm and BHY. For the probability the Sharpe is real, use validate_deflated_sharpe. A deflated Sharpe or overfitting probability above or below any threshold is not admission to anything and is not a forecast.
Paramètres, retour & exemple (6)
Paramètrestests· integer · optionnel
Tests run, this one included; gives the Bonferroni and independent-test haircuts.observations· integer · requis
Return observations behind the Sharpe.autocorrelation· number · optionnel
Lag-1 autocorrelation of returns, -1 to 1; default 0. Corrects the annualized Sharpe (Lo 2002).periods_per_year· number · requis
Periods per year: 252 daily, 365 crypto, 52 weekly, 12 monthly.observed_sharpe_annualized· number · requis
Annualized Sharpe as observed.other_sharpe_ratios_annualized· array · optionnel
Annualized Sharpes of the other tests over the same observations; adds Holm and BHY.
Exemple d'appel{"name": "validate_haircut_sharpe", "arguments": {"observations": 1, "periods_per_year": 1, "observed_sharpe_annualized": 1}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"data": {}, "note": "texte", "error": "texte", "limits": [], "receipt": "texte", "computed": "texte"}} - validate_luck_trials≈ 612 tokens
How many skill-less strategies a search would need for its best to reach this Sharpe by luck (Monte Carlo), and with a trial count, the chance it did. States luck as the best of N random tries; for the probability the Sharpe is real, use validate_deflated_sharpe. A deflated Sharpe or overfitting probability above or below any threshold is not admission to anything and is not a forecast.
Paramètres, retour & exemple (6)
Paramètresskew· number · optionnel
Skewness; below -0.5 the reading warns the counts are too generous.observations· integer · requis
Return observations behind the Sharpe.autocorrelation· number · optionnel
Lag-1 autocorrelation of returns, -1 to 1; default 0. Corrects the annualized Sharpe (Lo 2002).periods_per_year· number · requis
Periods per year: 252 daily, 365 crypto, 52 weekly, 12 monthly.observed_sharpe_annualized· number · requis
Annualized Sharpe as observed.effective_independent_trials· integer · optionnel
Independent trials tried; adds the chance the best reached this Sharpe by luck.
Exemple d'appel{"name": "validate_luck_trials", "arguments": {"observations": 1, "periods_per_year": 1, "observed_sharpe_annualized": 1}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"data": {}, "note": "texte", "error": "texte", "limits": [], "receipt": "texte", "computed": "texte"}} - validate_overfitting≈ 498 tokens
Probability of backtest overfitting (0 to 1) by CSCV: how often the in-sample best variant falls below the out-of-sample median. Needs every variant's returns (periods by variants); with summary statistics only, use validate_deflated_sharpe. A deflated Sharpe or overfitting probability above or below any threshold is not admission to anything and is not a forecast.
Paramètres, retour & exemple (4)
Paramètresseed· number · optionnel
Sampling seed; default 42.matrix· array · requis
Returns as fractions, one row per period, one column per variant.n_splits· integer · optionnel
Even number of blocks, at least 2; default 16.max_combinations· integer · optionnel
Most splits evaluated, up to 2000 (default).
Exemple d'appel{"name": "validate_overfitting", "arguments": {"matrix": []}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"data": {}, "note": "texte", "error": "texte", "limits": [], "receipt": "texte", "computed": "texte"}} - validate_paper_evidence≈ 562 tokens
Checks paper-evidence.v0 structure and disclosures. With CANLI_LOCAL=1, record_file reads an export bundle and journal_file verifies signatures, source hashes and recomputed claims. Without a journal, source facts and signatures are unchecked. Local files are never uploaded. This verdict is about the series exactly as submitted. The service never saw the data source, its costs, survivorship, or any lookahead in how the series was built.
Paramètres, retour & exemple (4)
Paramètresrecord· object · optionnel
A canli.paper-evidence.v0 record.signature· object · optionnel
Detached record signature for a signed inline record; requires journal_file.record_file· string · optionnel
Local record or export-bundle JSON path; requires CANLI_LOCAL=1.journal_file· string · optionnel
Local signed journal to recompute and bind; requires CANLI_LOCAL=1.
Exemple d'appel{"name": "validate_paper_evidence", "arguments": {"record": {}, "signature": {}, "record_file": "texte", "journal_file": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"data": {}, "note": "texte", "error": "texte", "limits": [], "receipt": "texte", "computed": "texte"}} - validate_reality_check≈ 619 tokens
Data-snooping tests on every variant a search tried: Hansen's SPA p-value that the best beat the benchmark only by luck, White's Reality Check, and the variants Romano-Wolf StepM finds better. Send all variants tried, not only the winners. A deflated Sharpe or overfitting probability above or below any threshold is not admission to anything and is not a forecast.
Paramètres, retour & exemple (7)
Paramètresreps· integer · optionnel
Bootstrap draws; default 2000.seed· integer · optionnel
Sampling seed; default 42.alpha· number · optionnel
Familywise error for StepM; default 0.05.matrix· array · optionnel
Returns of every variant the search tried, one row per period, one column per variant.benchmark· array · optionnel
Benchmark return per period; default zero.matrix_file· string · optionnel
Path to a CSV or JSON with one numeric column per variant, instead of matrix.block_length· integer · optionnel
Mean bootstrap block in periods; default round(n^(1/3)).
Exemple d'appel{"name": "validate_reality_check", "arguments": {"reps": 1, "seed": 1, "alpha": 1, "matrix": [], "benchmark": [], "matrix_file": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"data": {}, "note": "texte", "error": "texte", "limits": [], "receipt": "texte", "computed": "texte"}} - validate_track_record≈ 618 tokens
Minimum track record length (observations and years) for an observed Sharpe to beat a benchmark at a confidence level; with observations, the record's probabilistic Sharpe so far. For live or paper records; to size a backtest for its trials, use validate_backtest_length. A deflated Sharpe or overfitting probability above or below any threshold is not admission to anything and is not a forecast.
Paramètres, retour & exemple (7)
Paramètresskew· number · requis
Skewness of returns; 0 if Normal.confidence· number · optionnel
Between 0 and 1; default 0.95.observations· integer · optionnel
Record length so far, for its probabilistic Sharpe.periods_per_year· number · requis
Periods per year: 252 daily, 365 crypto, 52 weekly, 12 monthly.non_excess_kurtosis· number · requis
Kurtosis, not excess kurtosis; 3 if Normal.observed_sharpe_annualized· number · requis
Annualized Sharpe as observed.benchmark_sharpe_annualized· number · optionnel
Annualized Sharpe to beat; default 0.
Exemple d'appel{"name": "validate_track_record", "arguments": {"skew": 1, "periods_per_year": 1, "non_excess_kurtosis": 1, "observed_sharpe_annualized": 1}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"data": {}, "note": "texte", "error": "texte", "limits": [], "receipt": "texte", "computed": "texte"}} - verify_receipt≈ 365 tokens
Verify a receipt offline: its Ed25519 signature against the bundled canlicapital.com key, its output hash and its id. Send an id to fetch it first, or the receipt itself. The receipt is content-hashed, reproducible from the open-source core it names, and signed with Ed25519 by a key published at https://canlicapital.com/.well-known/canli-receipt-keys.json.
Paramètres, retour & exemple (3)
Paramètresid· string · optionnel
Receipt id from a validation result.receipt· object · optionnel
A receipt object, to verify without fetching.include_receipt· boolean · optionnel
With id: also return the stored receipt.
Exemple d'appel{"name": "verify_receipt", "arguments": {"id": "texte", "receipt": {}, "include_receipt": true}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"error": "texte", "valid": true, "checks": "texte", "key_id": "texte", "meaning": "texte", "receipt_id": "texte"}}
C'est votre serveur ?
Revendiquez-le sur l'espace créateur (preuve GitHub, domaine ou npm) pour afficher le badge « propriétaire vérifié » et lancer un pentest comportemental à la demande afin d'obtenir le badge « Vérifié ».