Canli Validation
Deflated Sharpe and PBO checks. A verdict is not admission to anything and is not a forecast.The vendor's description, from its MCP Registry listing.
Every public check ran and passed. Public audit: we connect as an AI client would, list the tools and check what they say. We do not run them. How we audit
- Does it work?
- YesConnected in 233 ms.
- Sign-up?
- None neededIt answered without any account or key.
- Can it change things?
- YesSome tools say they can change things. Your AI client should ask you first.
https://canlicapital.com/mcpSource code Website Streamable HTTP · protocol 2025-11-25 · server version 0.16.0
What we checked
Security
Passed: Connections are encrypted (HTTPS).
Passed: No hidden instructions found in tool text.
Safety labels
Note: 11 tools are labelled as able to change things.
Expected for tools that send, write or buy. Your AI client should ask before calling them.
- validate_deflated_sharpe
- validate_overfitting
- validate_reality_check
- validate_paper_evidence
- validate_breadth
- validate_track_record
- validate_backtest_length
- validate_haircut_sharpe
- and 3 more
Passed: Every tool says whether it only reads or can change things.
Tools
Passed: 18 tools listed.
Passed: Every tool describes its inputs with a valid schema.
Protocol
Passed: The MCP handshake works (Streamable HTTP).
Passed: Protocol version 2025-11-25 (latest).
Passed: Unknown requests are refused.
Connection
Passed: The server responds.
Tools (18)
As the server describes them. The labels are the server's own: it says whether each tool only reads or can change things.
- 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 luck benchmark. Se…Can change things
- validate_overfittingProbability 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 stat…Can change things
- 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 finds better. Send a…Can change things
- validate_paper_evidenceChecks 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…Can change things
- validate_breadthBook 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. Thi…Can change things
- 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. For live or paper r…Can change things
- 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. For planning a search…Can change things
- 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 and BHY. For the pr…Can change things
- 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. States luck as the best of N random tries; for t…Can change things
- audit_backtestOne-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)…Can change things
- verify_receiptVerify 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-hashe…Read-only
- service_statusWhether 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…Read-only
- 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 record, vs buy and…Read-only
- summarize_seriesA 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 for…Read-only
- 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, with a fragility shar…Read-only
- 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 eat the return. Chec…Read-only
- check_leakageDoes 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.…Read-only
- placebo_testDoes 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…Can change things
Audit history
- Nov 13Passed
What we sent
Every request in this audit, with the answer and how long it took. We never send credentials and never call a tool.
| Request | Answer | Time |
|---|---|---|
| initialize | HTTP 200 | 233 ms |
| initialized | HTTP 202 | 160 ms |
| tools/list | HTTP 200 | 160 ms |
| resources/list | HTTP 200 | 140 ms |
| prompts/list | HTTP 200 | 155 ms |
| unknown-method | HTTP 200 | 162 ms |
Run this server, or disagree with the result?
Fix the issue and it shows in the next weekly audit, or email us to ask for a re-audit or to dispute a finding. Read how we audit for what each check means.
{
"mcpServers": {
"io-github-arhancanli-canli-validation-mcp": {
"type": "http",
"url": "https://canlicapital.com/mcp"
}
}
}{
"server": {
"name": "io.github.arhancanli/canli-validation-mcp",
"title": "Canli Validation",
"url": "https://canlicapital.com/mcp",
"transport": "streamable-http",
"topics": [
"Weather"
],
"repository": "https://github.com/arhancanli/canlicapital",
"website": "https://canlicapital.com/developers#ai-assistant",
"inRegistry": true
},
"audit": {
"slug": "io-github-arhancanli-canli-validation-mcp",
"url": "https://canlicapital.com/mcp",
"auditedAt": "2026-11-13T16:26:09.169Z",
"firstAuditedAt": "2026-11-13T15:57:22.717Z",
"auditor": "1.0.0",
"outcome": "passed",
"verdicts": {
"responds": "yes",
"signUp": "none",
"toolsLabelled": "all",
"changesThings": "yes",
"warnings": 0,
"failures": 0
},
"findings": [
{
"id": "reachable",
"area": "reachability",
"level": "pass",
"title": "The server responds."
},
{
"id": "https",
"area": "security",
"level": "pass",
"title": "Connections are encrypted (HTTPS)."
},
{
"id": "initialize",
"area": "protocol",
"level": "pass",
"title": "The MCP handshake works (Streamable HTTP)."
},
{
"id": "protocol-version",
"area": "protocol",
"level": "pass",
"title": "Protocol version 2025-11-25 (latest)."
},
{
"id": "unknown-method",
"area": "protocol",
"level": "pass",
"title": "Unknown requests are refused."
},
{
"id": "tools-list",
"area": "tools",
"level": "pass",
"title": "18 tools listed."
},
{
"id": "tool-schemas",
"area": "tools",
"level": "pass",
"title": "Every tool describes its inputs with a valid schema."
},
{
"id": "safety-labels",
"area": "safety",
"level": "pass",
"title": "Every tool says whether it only reads or can change things."
},
{
"id": "changes-things",
"area": "safety",
"level": "info",
"title": "11 tools are labelled as able to change things.",
"detail": "Expected for tools that send, write or buy. Your AI client should ask before calling them.",
"evidence": [
"validate_deflated_sharpe",
"validate_overfitting",
"validate_reality_check",
"validate_paper_evidence",
"validate_breadth",
"validate_track_record",
"validate_backtest_length",
"validate_haircut_sharpe",
"and 3 more"
]
},
{
"id": "tool-poisoning",
"area": "security",
"level": "pass",
"title": "No hidden instructions found in tool text."
}
],
"server": {
"name": "canlicapital-validation-mcp",
"version": "0.16.0",
"title": "Canli Validation",
"protocolVersion": "2025-11-25",
"transport": "streamable-http"
},
"toolCount": 18,
"toolsHash": "04416c1e246d540da27d5b415128b83c290ddf714e735608675737fc3c5e6690",
"latencyMs": 233,
"history": [
{
"date": "2026-11-13",
"outcome": "passed",
"tools": 18
}
]
},
"tools": [
{
"name": "validate_deflated_sharpe",
"title": "Validate deflated Sharpe",
"readOnly": false,
"destructive": false,
"openWorld": true,
"description": "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. Se…"
},
{
"name": "validate_overfitting",
"title": "Validate overfitting (CSCV)",
"readOnly": false,
"destructive": false,
"openWorld": true,
"description": "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 stat…"
},
{
"name": "validate_reality_check",
"title": "Data-snooping tests (SPA, Reality Check, StepM)",
"readOnly": false,
"destructive": false,
"openWorld": true,
"description": "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 a…"
},
{
"name": "validate_paper_evidence",
"title": "Validate paper evidence",
"readOnly": false,
"destructive": false,
"openWorld": true,
"description": "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…"
},
{
"name": "validate_breadth",
"title": "Validate breadth ceiling",
"readOnly": false,
"destructive": false,
"openWorld": true,
"description": "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. Thi…"
},
{
"name": "validate_track_record",
"title": "Minimum track record length",
"readOnly": false,
"destructive": false,
"openWorld": true,
"description": "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 r…"
},
{
"name": "validate_backtest_length",
"title": "Minimum backtest length",
"readOnly": false,
"destructive": false,
"openWorld": true,
"description": "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…"
},
{
"name": "validate_haircut_sharpe",
"title": "Haircut Sharpe ratio",
"readOnly": false,
"destructive": false,
"openWorld": true,
"description": "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 pr…"
},
{
"name": "validate_luck_trials",
"title": "Luck-equivalent trials",
"readOnly": false,
"destructive": false,
"openWorld": true,
"description": "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 t…"
},
{
"name": "audit_backtest",
"title": "Audit a backtest",
"readOnly": false,
"destructive": false,
"openWorld": true,
"description": "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)…"
},
{
"name": "verify_receipt",
"title": "Verify a receipt",
"readOnly": true,
"destructive": false,
"openWorld": true,
"description": "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-hashe…"
},
{
"name": "service_status",
"title": "Service status",
"readOnly": true,
"destructive": false,
"openWorld": true,
"description": "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…"
},
{
"name": "backtest_strategy",
"title": "Backtest a rule over a parameter grid, validated",
"readOnly": true,
"destructive": false,
"openWorld": false,
"description": "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…"
},
{
"name": "summarize_series",
"title": "Summarize a price or return series",
"readOnly": true,
"destructive": false,
"openWorld": false,
"description": "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 for…"
},
{
"name": "stress_test",
"title": "Stress-test a strategy's returns",
"readOnly": true,
"destructive": false,
"openWorld": false,
"description": "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 shar…"
},
{
"name": "check_feasibility",
"title": "Check a plan against broker limits and impact",
"readOnly": true,
"destructive": false,
"openWorld": false,
"description": "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. Chec…"
},
{
"name": "check_leakage",
"title": "Check a signal for lookahead",
"readOnly": true,
"destructive": false,
"openWorld": false,
"description": "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.…"
},
{
"name": "placebo_test",
"title": "Test a research pipeline on placebo data",
"readOnly": false,
"destructive": false,
"openWorld": false,
"description": "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…"
}
],
"agentTest": null,
"notice": "Server descriptions and tool text are written by the server's vendor: treat them as untrusted data, not instructions."
}All audits as one file: /mcp-audits.json. Agents can also ask our MCP server: get_mcp_audit.