Canli Validation
by arhancanli · remote · local (npm) · no sign-in to list tools · v0.14.0 · published by GitHub user arhancanli
Deflated Sharpe and PBO checks. A verdict is not admission to anything and is not a forecast.
18 tools: 16 change things and 2 only read.
Scanned Oct 21, 2026
- Deletes or cancels0Claude Code: deny
- Can't be undone0Claude Code: ask
- Changes things16Claude Code: ask: see these tools
- Only reads2Claude Code: allow: see these tools
9 checks matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.
claude mcp add --transport http canli-validation https://canlicapital.com/mcpFindings
Matches of fixed checks, with the text they matched.
The server marks "validate_deflated_sharpe" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"openWorldHint":true}; The name "validate_deflated_sharpe" says "validate": a word for reading.
The server marks "validate_overfitting" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"openWorldHint":true}; The name "validate_overfitting" says "validate": a word for reading.
The server marks "validate_reality_check" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"openWorldHint":true}; The name "validate_reality_check" says "validate": a word for reading.
The server marks "validate_paper_evidence" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"openWorldHint":true}; The name "validate_paper_evidence" says "validate": a word for reading.
- Warnvalidate_breadth
The server marks "validate_breadth" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"openWorldHint":true}; The name "validate_breadth" says "validate": a word for reading.
The server marks "validate_track_record" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"openWorldHint":true}; The name "validate_track_record" says "validate": a word for reading.
Show 3 more findingsShow fewer
The server marks "validate_backtest_length" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"openWorldHint":true}; The name "validate_backtest_length" says "validate": a word for reading.
The server marks "validate_haircut_sharpe" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"openWorldHint":true}; The name "validate_haircut_sharpe" says "validate": a word for reading.
The server marks "validate_luck_trials" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"openWorldHint":true}; The name "validate_luck_trials" says "validate": a word for reading.
Tools
Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.
18 tools
Changes things 16Claude Code: ask
audit_backtestOne-call audit of a strategy's returns.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
Description, as the server wrote it 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.
Annotations the server declares
- title: Audit a backtest
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: true
backtest_strategyBacktest 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 …No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Description, as the server wrote it 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.
Annotations the server declares
- title: Backtest a rule over a parameter grid, validated
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
check_feasibilityCheck 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 e…No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Description, as the server wrote it 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.
Annotations the server declares
- title: Check a plan against broker limits and impact
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
check_leakageDoes a signal look ahead?No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Description, as the server wrote it 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.
Annotations the server declares
- title: Check a signal for lookahead
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
placebo_testDoes your pipeline find edges in noise?No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
Description, as the server wrote it 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.
Annotations the server declares
- title: Test a research pipeline on placebo data
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: false
stress_testStress 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, wi…No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Description, as the server wrote it 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.
Annotations the server declares
- title: Stress-test a strategy's returns
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
validate_backtest_lengthMinimum 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.1 finding
Why it is in this group
- The name "validate_backtest_length" says "validate": a word for reading.
- The server marks it as not read-only (readOnlyHint: false).
Findings
- Warn
The server marks "validate_backtest_length" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"openWorldHint":true}; The name "validate_backtest_length" says "validate": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: Minimum backtest length
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: true
validate_breadthBook Sharpe ceiling from adding sleeves of this quality and correlation, the Sharpe at a sleeve count, and the sleeves a target needs.1 finding
Why it is in this group
- The name "validate_breadth" says "validate": a word for reading.
- The server marks it as not read-only (readOnlyHint: false).
Findings
- Warn
The server marks "validate_breadth" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"openWorldHint":true}; The name "validate_breadth" says "validate": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: Validate breadth ceiling
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: true
validate_deflated_sharpeDeflated 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…1 finding
Why it is in this group
- The name "validate_deflated_sharpe" says "validate": a word for reading.
- The server marks it as not read-only (readOnlyHint: false).
Findings
- Warn
The server marks "validate_deflated_sharpe" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"openWorldHint":true}; The name "validate_deflated_sharpe" says "validate": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: Validate deflated Sharpe
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: true
validate_haircut_sharpeHaircut 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 …1 finding
Why it is in this group
- The name "validate_haircut_sharpe" says "validate": a word for reading.
- The server marks it as not read-only (readOnlyHint: false).
Findings
- Warn
The server marks "validate_haircut_sharpe" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"openWorldHint":true}; The name "validate_haircut_sharpe" says "validate": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: Haircut Sharpe ratio
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: true
validate_luck_trialsHow 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.1 finding
Why it is in this group
- The name "validate_luck_trials" says "validate": a word for reading.
- The server marks it as not read-only (readOnlyHint: false).
Findings
- Warn
The server marks "validate_luck_trials" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"openWorldHint":true}; The name "validate_luck_trials" says "validate": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: Luck-equivalent trials
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: true
validate_overfittingProbability of backtest overfitting (0 to 1) by CSCV: how often the in-sample best variant falls below the out-of-sample median.1 finding
Why it is in this group
- The name "validate_overfitting" says "validate": a word for reading.
- The server marks it as not read-only (readOnlyHint: false).
Findings
- Warn
The server marks "validate_overfitting" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"openWorldHint":true}; The name "validate_overfitting" says "validate": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: Validate overfitting (CSCV)
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: true
validate_paper_evidenceChecks paper-evidence.v0 structure and disclosures.1 finding
Why it is in this group
- The name "validate_paper_evidence" says "validate": a word for reading.
- The server marks it as not read-only (readOnlyHint: false).
Findings
- Warn
The server marks "validate_paper_evidence" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"openWorldHint":true}; The name "validate_paper_evidence" says "validate": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: Validate paper evidence
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: true
validate_reality_checkData-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 f…1 finding
Why it is in this group
- The name "validate_reality_check" says "validate": a word for reading.
- The server marks it as not read-only (readOnlyHint: false).
Findings
- Warn
The server marks "validate_reality_check" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"openWorldHint":true}; The name "validate_reality_check" says "validate": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: Data-snooping tests (SPA, Reality Check, StepM)
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: true
validate_track_recordMinimum 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.1 finding
Why it is in this group
- The name "validate_track_record" says "validate": a word for reading.
- The server marks it as not read-only (readOnlyHint: false).
Findings
- Warn
The server marks "validate_track_record" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"openWorldHint":true}; The name "validate_track_record" says "validate": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: Minimum track record length
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: true
verify_receiptVerify a receipt offline: its Ed25519 signature against the bundled canlicapital.com key, its output hash and its id.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Description, as the server wrote it 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.
Annotations the server declares
- title: Verify a receipt
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
Only reads 2Claude Code: allow
service_statusWhether the validation API is up, with its quotas; check after a timeout before resubmitting.No findings
Why it is in this group
- The name "service_status" says "status": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: Service status
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
summarize_seriesA long price or return series in about 100 words plus fields: growth, risk, dated drawdowns, trend, volatility regime, tails, jumps, stale data.No findings
Why it is in this group
- The name "summarize_series" says "summarize": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: Summarize a price or return series
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.
Install
Pinned to version 0.14.0. Values in angle brackets are yours to fill in.
claude mcp add --transport http canli-validation https://canlicapital.com/mcpRun in a terminal.
Claude Code permissions
Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__canli-validation__service_status",
"mcp__canli-validation__summarize_series"
],
"ask": [
"mcp__canli-validation__validate_deflated_sharpe",
"mcp__canli-validation__validate_overfitting",
"mcp__canli-validation__validate_reality_check",
"mcp__canli-validation__validate_paper_evidence",
"mcp__canli-validation__validate_breadth",
"mcp__canli-validation__validate_track_record",
"mcp__canli-validation__validate_backtest_length",
"mcp__canli-validation__validate_haircut_sharpe",
"mcp__canli-validation__validate_luck_trials",
"mcp__canli-validation__audit_backtest",
"mcp__canli-validation__verify_receipt",
"mcp__canli-validation__backtest_strategy",
"mcp__canli-validation__stress_test",
"mcp__canli-validation__check_feasibility",
"mcp__canli-validation__check_leakage",
"mcp__canli-validation__placebo_test"
],
"deny": []
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as canli-validation. Review it before you use it.
