Canli Validation について
Canli Validationは、コーディングエージェントなどがバックテストを検証するためのMCPサーバーです。統計検証ツールとローカル分析ツールを備え、結果には制約が示されます。API検証には署名済みレシートが付き、ローカルモードではAPIにデータを送信しません。
主な機能
- 01Deflated Sharpeと過剰適合の検証
- 02複数バリアントのデータスヌーピング検定
- 03トラックレコードとバックテスト期間の検証
- 04複数検証をまとめた監査
- 05リターン系列のローカル分析ツール
- 06署名済みレシートのオフライン検証
活用シーン
- 01試行済みバリアントを考慮したSharpe比の評価
- 02複数戦略のデータスヌーピング検定
- 03複数の検証ツールによるバックテスト監査
- 04検証レシートのオフライン確認
MCP 対応
MCPクライアントに検証、監査、レシート、サービス状態、財務履歴、ローカルラボのツールを提供します。ホスト済みAPIの利用、APIへ送信しないローカル実行、ホスト済みMCPエンドポイントへの接続に対応します。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://canlicapital.com/mcpclaude mcp add --transport http arhancanli-canli-validation https://canlicapital.com/mcp{"mcpServers":{"arhancanli-canli-validation":{"type":"http","url":"https://canlicapital.com/mcp"}}}Cursor で開く{"servers":{"arhancanli-canli-validation":{"type":"http","url":"https://canlicapital.com/mcp"}}}VS Code で開く{"mcpServers":{"arhancanli-canli-validation":{"type":"http","url":"https://canlicapital.com/mcp"}}}{"mcpServers":{"arhancanli-canli-validation":{"serverUrl":"https://canlicapital.com/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
https://canlicapital.com/mcp認証が必要ツール
18| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| skew | number | いいえ | リターンの歪度。正規分布の場合は 0。 |
| returns | array | いいえ | 期間ごとのリターンを小数で指定します(0.01 = 1%)。古い順に並べます。Sharpe、観測数、歪度、尖度の代わりに使用します。 |
| observations | integer | いいえ | リターンの観測数。 |
| periods_per_year | number | いいえ | 年間の期間数:日次は 252、暗号資産は 365、週次は 52、月次は 12。 |
| non_excess_kurtosis | number | いいえ | 尖度(超過尖度ではありません)。正規分布の場合は 3 です。 |
| observed_sharpe_annualized | number | いいえ | 観測された年率換算シャープレシオ。 |
| effective_independent_trials | integer | いいえ | このバリアントを選択する前に試した独立バリアントの数。 |
| cross_trial_sharpe_sd_annualized | number | いいえ | これらの試行における年率換算シャープレシオの標準偏差。 |
詳細
canli-validation-mcp
最高のバックテストは本物でしょうか。それとも、試したバリエーションの中で最も運が良かっただけでしょうか。 この MCP サーバーを使うと、Claude、Cursor、その他の MCP クライアントが、標準的な補正を用いてその問いに答えられます。具体的には、デフレートされたシャープレシオ、バックテスト過剰適合の CSCV 確率、試したすべてのバリエーションに対するデータスヌーピング検定(Hansen の SPA、White の Reality Check、Romano-Wolf StepM)、最小トラックレコード長、ヘアカット・シャープレシオ、運に相当する試行回数です。無料で、MIT ライセンスです。
クイックスタート
# Claude Code, computed on your machine: no key, nothing sent anywhere
claude mcp add canli-local --env CANLI_LOCAL=1 -- npx -y canli-validation-mcp
# the same tools with signed, stored receipts from the free API (a free key is issued on first use)
claude mcp add canli -- npx -y canli-validation-mcp
# nothing to install: the hosted endpoint
claude mcp add --transport http canli https://canlicapital.com/mcp
次のように尋ねてみてください。「229 個のバリエーションを試して最良のものを選びました。日次リターン 730 個(年間 365 日)で年率換算シャープレシオは 1.5、歪度は -0.5、尖度は 5、バリエーションのシャープレシオのばらつきは 0.57 です。本物でしょうか?」 アシスタントは validate_deflated_sharpe を呼び出します。スキルのない 229 個のバリエーションのうち最良のものでも、運だけで 1.60 に達するため、探索を考慮すると、シャープレシオがゼロを上回る確率は 98.1% から 44.4% に下がります。Claude Desktop やその他の stdio クライアント(Cursor、VS Code)でも同じ npx コマンドを実行できます。詳しくは、以下の「Claude Desktop」と「汎用 stdio クライアント」をご覧ください。
機能
canlicapital.com の無料キー認証付き検証 API を利用する MCP(Model Context Protocol)サーバーと、お使いのマシン上で計算を行うラボを提供します。コーディングエージェントが使える 20 個のツールを備えています。無料キーの発行、9 種類の検証の実行(デフレートされたシャープレシオ、CSCV 過剰適合、データスヌーピング検定(Hansen の SPA、White の Reality Check、Romano-Wolf StepM)、論文エビデンスへの適合性、幅の上限、最小トラックレコード長、最小バックテスト期間、ヘアカット・シャープレシオ、運に相当する試行回数)、複数の検証を 1 回の呼び出しで使ったバックテストの監査、レシートの署名のオフライン検証、サービス状況の確認、SEC 提出書類からの企業の過去の財務情報の取得に加えて、6 つのラボツールを利用できます。パラメーターグリッドに対するルールのバックテスト、長い時系列データの要約、戦略リターンのストレステスト、計画とブローカーの制限の照合、シグナルに先読みがないかの確認、プラセボデータを使った研究パイプライン全体のテストが可能です。各検証結果には、数値に加えて、その結果が示さないことを説明する文と、成功またはエラーを記録したレシートが含まれるため、エージェントが限界を知らずに数値だけを見ることはありません。
このパッケージは npm で canli-validation-mcp として公開されています。公式 MCP Registry(io.github.arhancanli/canli-validation-mcp)と cursor.directory にも掲載されています。以下のように npx で実行でき、インストールは不要です。このパッケージ自体を開発またはテストする場合にのみ、ローカルチェックアウトが必要です。詳しくは下部の「ローカルチェックアウト」をご覧ください。
この README は package.json に記載されたバージョンについて説明しています。バージョンを指定しない npx は npm の最新リリースを実行します。特定のバージョンに固定するには、npx -y canli-validation-mcp@<version> を使います。
エージェントの利用精度
固定ベンチマークでは、モデルにこれらのツールを提供し、同じ検証済みコードで計算した正解データを基準として、適切なツールを選び正しい答えを返せるかを評価します。3 つのモデルの結果と、すべての実行記録は
bench/agent/README.md にあります。
API とは何か(そして何ではないか)
エンジンこそが製品です。このサービスは、送信された数値に対して、canlicapital.com 自身の論文記録に用いているのと同じ誠実性に関する計算を実行し、誰でもレシートから再計算できる判定を返します。すべてのレシートに署名しますが、市場データは受け付けず、戦略の評価も行いません。また、データソースやそのコスト、あるいは時系列の作成方法に先読みが含まれていたかどうかを知ることもありません。設計の全容については、メインリポジトリの docs/superpowers/specs/2026-09-05-developer-key-validation-api-design.md をご覧ください。
ツール
未リリースのソースでは、validate_paper_evidence にローカルジャーナルとの照合機能が追加されています。リポジトリから CANLI_LOCAL=1 node mcp/src/server.mjs を実行し、record または record_file のいずれか一方と、journal_file を指定して、ソースハッシュ、署名、再計算された主張を確認します。record_file は標準レコード、{record,signature} エンベロープ、または実行エクスポート一式を受け付けます。一式の場合、付随するメトリクス/観測値も確認します。署名付きレコードには切り離された署名が必要です。ソース検証に合格するには、bindings.all_match が true でなければなりません。ジャーナルがない場合、結果には構造上の適合性のみを確認したことが明示されます。ホスト型/リモートモードではファイルと署名は拒否され、アップロードされることもありません。ローカルの結果に Canli のレシートは含まれません。現行の npm/ホスト型リリースでは、従来どおりレコードのみを受け付ける API が維持されます。
| ツール | 呼び出し先 | キーが必要 |
|---|---|---|
get_key | POST /api/v1/keys(キーが設定されていない場合のみ表示) | いいえ |
validate_deflated_sharpe | POST /api/v1/validate/deflated-sharpe | はい |
validate_overfitting | POST /api/v1/validate/overfitting | はい |
validate_paper_evidence | POST /api/v1/validate/paper-evidence | はい |
validate_breadth | POST /api/v1/validate/breadth | はい |
validate_track_record | POST /api/v1/validate/track-record | はい |
validate_backtest_length | POST /api/v1/validate/backtest-length | はい |
validate_haircut_sharpe | POST /api/v1/validate/haircut-sharpe | はい |
validate_luck_trials | POST /api/v1/validate/luck-trials | はい |
validate_reality_check | POST /api/v1/validate/reality-check(matrix_file はお使いのマシン上で読み込まれ、数値として送信されます) | はい |
audit_backtest | デフレート・シャープレシオとトラックレコードの各ルートを実行し、その後、総合結果を返します。variants がある場合は、過学習およびデータスヌーピングの各ルートも実行します。ない場合は、運試しの試行回数を検証します。各検証は1回ずつです | はい |
verify_receipt | ID が指定されている場合は GET /api/v1/receipts/{id}(include_receipt を指定すると保存済みレシートを返します)。確認処理はローカルで実行されます | いいえ |
service_status | GET /api/v1/validate/status | いいえ |
company_financial_history | GET /company-data/{cik}.json(ティッカーは GET /api/v1/company-tickers.json で解決されます) | いいえ |
validate_deflated_sharpe は、次の2種類の入力形式のいずれか一方だけを受け付けます。両方を混在させることはできません。
- 7つの契約フィールド:
observed_sharpe_annualized、observations、periods_per_year、skew、non_excess_kurtosis、effective_independent_trials、cross_trial_sharpe_sd_annualized; - または、リターン時系列とそれに対応する試行回数:
returns、periods_per_year、effective_independent_trials、cross_trial_sharpe_sd_annualized。
両方の形式のフィールドを送信した場合、またはいずれの形式のフィールドも送信しなかった場合は、リクエストがプロセス外へ送信される前に拒否されます。src/schemas.mjs をご覧ください。
validate_reality_check には、探索で試したすべてのバリアントのリターンを指定します。各期間を1行、各バリアントを1列として、matrix または matrix_file(お使いのマシン上の CSV または JSON ファイル)で渡します。任意で benchmark 系列も指定できます。指定しない場合、バリアントはゼロと比較して検定されます。シードを固定した1回の定常ブートストラップで、3つの検定を実行します。
- Hansen の SPA:どのバリアントにも優位性がない場合に、最良のバリアントのスチューデント化超過リターンがこれほど良くなる確率と、その下限・上限です(
spa.p_value(整合的な p 値)が主要な値で、monte_carlo_seはそのサンプリング誤差です)。 - White の Reality Check:スチューデント化を行わずに同じ問いに答えるため、ボラティリティの高いバリアントが結果を左右することがあります。
- Romano と Wolf の StepM:
alphaにおける家族内誤差率を維持しながら、ベンチマークを上回るバリアントを特定します。
結果は seed から完全に再現できます。固定シードの 3 つのケースで、p 値は Python の arch 8.0 および Hansen の数式を numpy で書き起こしたものと、モンテカルロ誤差の範囲内で一致し、StepM の集合も arch の結果と一致します(js/snooping-core.test.js)。カウントされるのは送信されたバリアントだけです。試した数より送信した数が少ない検索では、実際より運の影響が小さく見えてしまいます。
company_financial_history はほかのツールとは異なり、検証 API ではなく、canlicapital.com にある公開企業情報を読み取ります。企業の利用可能な財務履歴を一覧表示するには CIK(1〜10 桁)を指定し、観測値を取得するには CIK と Revenues などの us-gaap コンセプトを指定します。観測値は新しい順に並びます(limit のデフォルトは 40、最大値は 200)。各観測値には提出アクセッション番号、フォーム、提出日、単位が保持され、結果には元の SEC レスポンスの SHA-256 と、レコード固有の境界文が含まれます。つまり、これらは SEC に報告された会計上の数値であり、市場価格、リターン、推奨ではありません。現在のリリースに含まれていない企業やコンセプトを指定すると、利用可能なコンセプトの一覧を含むエラーが返されます。
ラボ:バックテスト、要約、ストレステスト、実現可能性、先読み、プラセボ
6 つのツールは、API に何も送信せず、レシートも保存せずに、お使いのマシンまたはホストされたエンドポイント上で、サーバープロセス内で計算を行います。各結果には、計算に使用した数値そのものの SHA-256 が示され、結果からは何が確立できないかも記載されています。
backtest_strategyは、価格データに対して、グリッド内のすべてのパラメーターセットでルールを実行します。sma_cross(fast、slow)、momentum(lookback、skip)、mean_reversion(window、entry_z)、breakout(lookback)、またはbuy_and_holdを、ロングのみ、あるいはallow_shortを指定して実行し、 ターンオーバーの1単位あたりにコストを適用します。各期間に保有するポジションは、その期間の直前までの終値から決定されるため、どのルールも未来を参照できません(テストでは後の価格を変更し、それ以前のポジションが変わらないことを確認します)。その後、宣言された数ではなく、この呼び出しで実行したバリアント数を使って最良のバリアントを検証します。グリッドで測定したシャープレシオの分散に基づくディフレート・シャープレシオ、すべてのバリアントのリターンを使ったCSCVバックテスト過剰適合確率、確率的シャープレシオ、最低トラックレコードを、同じ期間のバイ・アンド・ホールドと並べて示します。1回の呼び出しにつき、バリアントは最大200個、価格データは最大20,000件です。コードは一切実行されません。戦略はファミリーと数値の組み合わせです。summarize_seriesは、長期の価格またはリターン系列を読み取り、約100語の概要と、各指標のフィールドを出力します。成長率、ボラティリティ、シャープレシオとドリフトのt統計量、最悪のドローダウン(その日付と回復を含む)、トレンド、ボラティリティレジーム(自身の21期間ボラティリティの三分位)、テール、ジャンプ(ロバスト標準偏差の6倍を超えるもの)、自己相関、古いデータ、さらにベンチマークがある場合は相関とベータです。5年間の日次系列は約1,260個の数値ですが、要約は1つの段落です。stress_testは、定常ブロック・ブートストラップを使って戦略のリターンをリサンプリングし(シードが設定されているため、実行結果は完全に再現可能です)、ドローダウン上限を超える頻度とシャープレシオがマイナスになる頻度を報告します。続いて、ルールを明記した4つのシナリオを適用します。株式資産の最高値での暴落(デフォルトは20%と最悪の期間の3倍のうち大きい方)、ボラティリティの倍率変更、最悪の期間の再現、最悪の期間の後に複数期間にわたってポジションが固定されるシナリオです。脆弱性の割合は、リサンプリングした履歴のうち、ドローダウン上限を超えるか、リスク調整後ベースで損失を出す割合です。生成モデルは使いません。1つの系列で学習すると、その系列を記憶するか、検証できないダイナミクスを作り出すためです。check_feasibilityは、取引前に、実際のブローカーに照らして計画を確認します。ブローカーが公表する注文レート制限と、リバランス時に集中して発生する注文数(Alpacaは1分あたり200件、Interactive Brokersは1秒あたり約50件)、最低注文額(Alpacaは想定元本1 USD)、2026年時点の米国デイトレード規則(FINRAは2026年6月4日にパターン・デイトレーダー規則と最低25,000 USDの要件を廃止しました。各社は代替規則への移行を2027年10月20日まで段階的に進める場合があります)、現金口座でのT+1決済、各注文が日次出来高に占める割合、平方根市場インパクト(係数Y、デフォルトは1。同じ戦略を実行するすべてのコピーを計上)、そしてコストとインパクトが予想グロスリターンを消し去る資本額を確認します。各ブローカー情報には、確認日と情報源が記載されます。check_leakageは、シグナルのコードを見ずに先読みを検出します。最初のn行で計算された因果的シグナルは、全体を実行したときの同じ行の値と完全に一致します。planがカット位置を選び(シードを使い、系列の40%から95%の範囲内)、各カットより前の行を使って独自のコードを再実行します。compareはすべての列を確認し、後の行を取り除いたときに値が変わった列は、その行を参照していたと判定します。お使いのマシンでは、columns_fileに、スクリプトが書き出した{cuts, columns}形式のJSONファイルのパスを指定できます(PythonのNaNは欠損値として読み取られます)。これにより、何千もの数値を貼り付ける必要はありません。結果にはパターンが示されます。行先の未来データとその参照期間(shift(-5)は5行先を参照します)、全サンプル(系列全体を使った正規化、順位付け、スケーリング、またはフィッティング)、あるいは散在する行(欠損を後方から埋める処理)です。固定された22個のpandasおよびstatsmodelsシグナルのセット(scripts/research/leakage/のconfig/research/leakage-zoo.json)では、11個すべてのリークが正しいパターンで検出され、健全な指標11個には誤検出がありません。テストに合格しても、検証したカットに限られます。サバイバーシップバイアス、ベンダーによる改訂、または最初の行だけにあるリークの痕跡は残りません。placebo_testは、研究パイプライン全体を一度に検証します。planは、システムの一時ディレクトリ内の新しいフォルダーに、パネル(real.csv)と19個のプラセボを書き出します。リターンは同じまま期間の順序をランダムに並べ替え、すべての資産で同じ順序を使うため、各資産のリターンと各日のクロスセクションは保たれますが、何も予測できません。検索、フィルター、パラメーター選択を含め、パイプラインを変更せずにそれぞれに対して実行し、compareは実結果をプラセボ結果の中で順位付けします。パイプラインが行う選択はすべて計上されます。プラセボごとに同じ選択が再び行われるためです。事前登録された研究で並べ替え方法が選定されました(scripts/research/placebo/v1/、config/research/placebo-v1-evaluation.json)。何も予測できない市場とパイプラインの30通りすべての組み合わせ(各10,000件のテスト。リターン形状は5種類、すなわちフラット、ドリフトあり、資産間の違いが定数平均のみのもの。SMA、時系列モメンタム、クロスセクショナル・モメンタムのグリッド)で、名目5%における偽陽性率は4.6%から5.5%でした。同じ市場で最良のルールにt検定を行うと、エッジが見つかる割合は10.9%から78.9%でした。また、ボンフェローニ補正では、市場にドリフトがある場合は8.0%から10.3%、資産間の違いが平均値のみの場合は58.5%から59.7%でした。プラセボが19個の場合、最小のp値は0.05です。99個なら、さらに細かい値が得られます。 自分のマシンでは、prices_file、series_file、returns_fileには数値の代わりに CSV または JSON ファイルのパスを指定します。数値だけが読み込まれます。ファイルに ISO 形式の日付列がある場合はそれも読み込まれるため、ドローダウンが始まった日を結果に表示できます。
試行台帳:エージェントが試したすべてのバリエーションを記録する
エージェントは1時間に数千もの戦略バリエーションを試すことがあり、その中で最良のものが、運だけで優れた戦略に見えることがあります。運の影響の大きさは、試した数と結果のばらつきによって決まるため、報告された勝者を正直に評価するには、検索全体を確認する必要があります。台帳がそれを記録します。
CANLI_TOOLSETS=validate,lab,ledger(または all)で有効にし、次の手順で使います。
- バリエーションを試すたびに、
ledger_record_trialを呼び出します。リターン(またはリターンファイル)、あるいは年率換算シャープレシオとサンプル数に加え、ラベルとパラメーターを指定します。最初の呼び出しで台帳が作成され、その名前が返されます。以降は同じ名前を再利用します。各応答には、その時点までの検索全体の集計が含まれます。 - 評価には
ledger_summaryを呼び出します。最良の試行、同じ試行数をスキルなしで行った場合に運だけで達しうるシャープレシオ、全試行を考慮した最良の試行のデフレート・シャープレシオ、そしてすべての試行でリターンが揃っている場合のバックテスト過剰適合確率(CSCV)が確認できます。 - 検索結果を他の人に渡すには
ledger_exportを呼び出します。各試行は SHA-256 で直前の試行とチェーンされているため、試行の削除、並べ替え、編集があると検出できます。
台帳は CANLI_LEDGER_DIR(デフォルトは ~/.canli/ledgers)に JSON Lines ファイルとして保存されます。データがマシンの外に送信されることはありません。この方法で純粋なノイズを20種類記録すると、最良の年率換算シャープレシオは約1.5、運だけで期待される値は約1.7、デフレート・シャープレシオは約0.4となり、台帳はその勝者の実態を示します。統計処理には、validate_deflated_sharpe と validate_overfitting で検証済みの同じコードを使います。test/ledger.test.mjs では両方の方向を確認しています(ノイズにはフラグが立ち、ノイズに混じった実際の優位性はデフレート・シャープレシオが0.95を上回ります)。
1 回の呼び出しでバックテストを監査する
audit_backtest は、1 つの戦略のリターン系列と、できればすべてのバリアントのリターン(除外したものも含む variants または variants_file)を受け取ります。バリアントのリターンがない場合は、試したバリアントの数と、そのシャープレシオのばらつきを受け取ります。結果の冒頭には、次の項目が表示されます。
headline:偽陽性率が測定された時点で、まだ誰もあなたの数値を見ていなかったテストから選ばれた、1 つのテストです。Null Zoo v1(リポジトリ内のscripts/research/null-zoo/v1/)では、真の値が既知の 9 種類のリターン形状から、数十万件のシミュレーション検索を実施しました。基準とテストの選定ルールは、実行前にコミットされています。バリアントがある場合、見出しにはデータスヌーピング検定(validate_reality_checkとその証明情報)の結果が使われ、ない場合は Lo の自己相関補正を適用した偶然の試行の結果が使われます。見出しの文には、あなたのリターンに近い形状で測定された偽陽性率と、9 種類の形状全体での最悪値が記載されます。fix_next:次に行う手順を最大 5 件まで、それぞれ安定した ID を持つ{id, why, next}として示します。computed:Lo による調整済みシャープレシオ、シャープレシオの定常ブートストラップ 95% 区間、ヘアカット後のシャープレシオ、必要な最小バックテスト期間、さらにバリアントがある場合は、それらが何件の独立した試行に相当するか(Li and Ji)と、選択したバリアントのアウトオブサンプルでの劣化を示します。
続いて、各種チェックが行われます。リターン系列に対する validate_deflated_sharpe(推定値)、チェックで導出されたシャープレシオ、歪度、尖度に対する validate_track_record、そしてバリアントがある場合は validate_overfitting が実行されます。各項目は、それぞれの証明情報とともに、対応するツールが返す内容そのものです。デフレート・シャープレシオは、申告された試行回数と、集計された試行回数のうち大きい方、およびシャープレシオのばらつきを使って計算されます。そのため、検索の規模を実際より小さく見せることはできません。チェックが拒否された場合、または実行できない場合は、そのチェックのエラーとして報告されます。監査独自の評価は追加されません。API 経由では、チェックごとに 1 回の検証を使用します。
サーバーがあなたのマシン上で実行されている場合、returns_file と variants_file には数値の代わりにバックテスト出力のパスを指定できます。対応するのは CSV(カンマ、セミコロン、タブ区切りで、ヘッダーの有無は問いません。日付列とラベル列は無視され、名前のない列または連番のインデックス列はスキップされ、そのことが報告されます)または JSON 配列です。複数の列がある場合は、returns_column で列を選択します。読み込まれるのは数値のみです。ホスト型エンドポイントではファイルパスは受け付けられません。エージェントが長い系列を呼び出しにコピーすると、値を落とすおそれがあり、コピーにはトークンも必要です。エージェントのベンチマークでは、ファイルを読み込む方法に切り替えた結果、gpt-5.4-mini で監査に関する質問への正答数が 9 問中 4 問から 8 問に増えました。
プロンプト、リソース、構造化された結果
MCP プロンプトを表示するクライアントでは、8 つのガイド付きワークフローを利用できます。validate_backtest(デフレート・シャープレシオ、次に過剰適合、最後に必要なトラックレコードを、それぞれの数値で証明できないこととともに報告)、track_record_needed、backtest_and_validate、stress_my_strategy、production_check、summarize_market_series、check_signal_for_lookahead、test_pipeline_on_placebos です。リソースは次のとおりです。canli://limits はすべての結果に付随する境界を示す文、canli://sources は各バリデーターの根拠となる論文と、それぞれを論文に照らしてどのように検証するか、canli://strategy-spec はすべての戦略ファミリーとそのパラメーターの JSON Schema、canli://openapi は API の OpenAPI 3.1 ドキュメントです。ツール向けのコードを書くためのリソーステンプレートが 2 つあります。canli://schemas/{tool} はツールの正確な入力・出力 JSON Schema を返し、canli://examples/{language}/{tool} は python、javascript、curl のいずれかで動作する呼び出し例を返します(どちらの変数も補完してください)。テストでは、生成されたすべての Python と JavaScript の例をコンパイルし、すべての例の引数が有効な入力であることを確認します。各ツールの結果には、テキストと structuredContent の両方で、そのエンベロープが含まれます。
コンパクトなコンテキスト(0.3.0)
エージェントは、読み取らない空白も含め、ツールが返すすべてのトークンに対して料金を支払います。0.3.0 以降、すべての結果は JSON を最小化した形式になり、企業の履歴では、観測結果が 1 つの columns ヘッダーと観測結果ごとの 1 行として返されます。すべての行で共通する単位は一度だけ示されます。フィールドは一切削除されません。各境界文、アクセッション番号、フォーム、提出日、ソースハッシュはすべて結果に含まれ、columns と rows で各観測結果を正確に再構築できます。
ライブレコード各 20 件を対象に bench/token_cost.py で測定しました(トークナイザー:tiktoken o200k_base。他のトークナイザーでは絶対数が異なります)。
| レコード | 0.2.0(インデントあり) | 最小化 | 0.3.0(最小化、列形式) |
|---|---|---|---|
| Apple、StockholdersEquity | 2,214 | 1,560(−29.5%) | 1,060(−52.1%) |
| Microsoft、CashAndCashEquivalentsAtCarryingValue | 2,231 | 1,574(−29.4%) | 1,065(−52.3%) |
検証ツールでの変更は最小化のみです。ライブの service_status エンベロープは、インデントありで 593 トークン、最小化後で 475 トークン(−19.9%)でした。境界文は一字一句そのまま保持されています。これらは本結果の測定値であり、他のサーバーについて主張するものではありません。
0.2.0 からの破壊的変更: history.observations は、オブジェクトの配列ではなく {unit?, columns, rows} になりました。
設定
| 変数 | デフォルト | 意味 |
|---|---|---|
CANLI_API_BASE | https://canlicapital.com | API の場所です。テストする場合は、プレビュー環境を指定してください。 |
CANLI_KEY | 未設定 | POST /api/v1/keys で発行済みのキーです。設定すると、get_key はリクエストを送信せず、キーがすでに設定されていることを報告します。それ以外のすべてのツールは、Authorization: Bearer <key> として送信します。 |
CANLI_FULL_ENVELOPE | 未設定 | 1 または true の場合、各検証について、コンパクトな結果(以下)ではなく、完全な API エンベロープを返します。 |
CANLI_TOOLSETS | すべて | リストに表示するツールです。validate、receipts、company、status、lab のカンマ区切りの選択肢、または all を指定します。不明な名前を指定すると、起動時に拒否されます。以下の「ツールセット」を参照してください。 |
CANLI_LOCAL | 未設定 | 1 または true の場合、このマシン上で 8 つのバリデーターを実行します(以下のプライベートなローカルモード)。キー、ネットワーク、レシートは不要です。 |
CANLI_KEY が設定されておらず、ローカルモードも無効な場合は、バリデーターを実行する前に、セッションごとに一度 get_key を呼び出してください。返されるキーは、このプロセスのメモリ内にセッションの存続中のみ保持され、ディスクには書き込まれません。
HTTP エラーと API エラーエンベロープは、完全な JSON エンベロープを保持したまま、MCP ツールエラーとして示されます。否定的な判定を返す検証成功は、通常の結果のままです。リクエストにはヘッダーと本文を含む 30 秒の期限が設けられ、リダイレクトは拒否され、自動再試行は行われません。サービスがリクエストを処理した後にタイムアウトする場合があります。再送信するか判断する前に、サービスステータスを確認してください。JSON 以外のレスポンス本文と生のネットワークエラーは、ツールエラーから省略されます。
インストール
インストール手順はありません。初回実行時に npx が公開済みパッケージを取得するため、以下の各クライアント設定では npx -y canli-validation-mcp を起動するだけです。公開済みパッケージを実行するのではなく、このパッケージ自体を開発またはテストするには、下部の「ローカルチェックアウト」を参照してください。
ホスト型エンドポイント(インストール不要)
同じツールを、MCP Streamable HTTP 経由で https://canlicapital.com/mcp から提供しています。プロセスを起動する代わりに URL に接続するクライアント(Claude.ai コネクター、ChatGPT、Cursor のリモートサーバーなど)向けです。インストールは不要で、お使いのマシンに Node.js がなくても利用できます。
claude mcp add --transport http canli https://canlicapital.com/mcp
キーを指定しない場合、リクエストは共有匿名キーを使って実行されるため、1 日あたりの検証クォータをすべてのホスト型呼び出し元で共有します。その日の共有クォータを使い切った場合も、検証には引き続き応答します。ホスト型エンドポイント上の同じコードで計算されますが、レシートは保存されず、その旨が結果に示されます。ご自身のクォータを使うには、無料キーを発行し(/developersを参照)、ヘッダーとして送信してください。
claude mcp add --transport http canli https://canlicapital.com/mcp --header "Authorization: Bearer $CANLI_KEY"
URL に ?toolsets= を追加すると、一部のツールだけを一覧表示できます(下記の「ツールセット」を参照)。例:https://canlicapital.com/mcp?toolsets=company。
このエンドポイントはステートレスです。ここで get_key を呼び出してもキーは発行されず、使用中のキーが示されます。ここで発行したキーは次のリクエストに引き継がれないためです。不正な形式の Authorization ヘッダーは、共有キーに置き換えずに拒否されます。
Claude Desktop
claude_desktop_config.json に追加します(Settings、Developer、Edit Config)。
{
"mcpServers": {
"canli": {
"command": "npx",
"args": ["-y", "canli-validation-mcp"]
}
}
}
その後、Claude Desktop を再起動してください。デフォルトではなくプレビュー環境に接続するには、CANLI_API_BASE を含む "env" オブジェクトを追加します。
Claude Code
claude mcp add canli -- npx -y canli-validation-mcp
claude mcp list を実行して登録を確認し、claude mcp remove canli を実行すると削除できます。
プライベートローカルモード
CANLI_LOCAL=1 を設定すると、8 つのバリデーターがご自身のマシンで実行されます。送信した系列に関する情報は canlicapital.com に送られず、キーは不要で、レシートも保存されません。計算処理は API 独自のもので、src/local にバイト単位でそのまま含まれています(内容に差異があるとテストが失敗します)。そのため、ローカルの結果はホスト型の結果と一致します。レシートは作成されないため、結果にレシート ID は記載されません。
claude mcp add canli-local --env CANLI_LOCAL=1 -- npx -y canli-validation-mcp
verify_receipt による ID 指定の検証、service_status、company_financial_history は引き続き canlicapital.com から読み取ります。系列は送信されません。Claude Desktop 拡張機能では、この設定は「プライベートローカルモード」です。
汎用 stdio クライアント
プロセスを起動して stdio で通信できる MCP クライアントなら、どれでも利用できます。Node から公式 SDK を直接使う場合は、次のとおりです。
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
const transport = new StdioClientTransport({
command: "npx",
args: ["-y", "canli-validation-mcp"],
env: { ...process.env, CANLI_API_BASE: "https://canlicapital.com" },
});
const client = new Client({ name: "my-agent", version: "0.1.0" });
await client.connect(transport);
const { tools } = await client.listTools();
console.log(tools.map((t) => t.name));
const keyResult = await client.callTool({ name: "get_key", arguments: { label: "my-agent" } });
if (keyResult.isError) throw new Error("Key setup failed; inspect the error privately.");
// The session retains the issued key. Avoid printing its envelope into logs.
const result = await client.callTool({
name: "validate_deflated_sharpe",
arguments: {
returns: [0.004, -0.002, 0.007, 0.001, -0.003, 0.005, 0.002, -0.001],
periods_per_year: 252,
effective_independent_trials: 30,
cross_trial_sharpe_sd_annualized: 0.5,
},
});
console.log(result.content[0].text); // the answer, its limits and its receipt
await client.close();
結果からは立証されないこと(適用範囲の説明)
このサーバーが返すすべてのエンベロープには、API 自体(api/_lib/limits.js)からの次の文がそのまま含まれます。
- この判定は、送信されたとおりの系列に関するものです。サービスはデータソース、そのコスト、生存者バイアス、または系列の構築方法における先読みを確認していません。
- デフレートされたシャープレシオや過剰適合確率が、いずれかのしきい値を上回るか下回るかは、何かへの参加資格を示すものではなく、予測でもありません。
- レシートはコンテンツハッシュ化され、明記されたオープンソースのコアから再現可能であり、https://canlicapital.com/.well-known/canli-receipt-keys.json で公開されている鍵による Ed25519 署名が付されています。
- クォータ:キーごとに UTC 日あたり 1000 件の検証、クライアントごとに UTC 日あたり 5 個のキー、検証リクエストあたり 1048576 バイト、キー失効リクエストあたり 1024 バイト、系列あたり 20000 件の観測値、行列あたり 200 個のバリアント。
各ツールの説明にもこれらの文のいずれかが記載されているため、エージェントはツールを呼び出す前に適用範囲を確認できます。呼び出した後だけではありません。
コンパクトな結果(トークン)
検証結果に含まれるのは、回答(data)、上記の文(クォータの行を除く)、およびレシートの ID と URL です。エラーの場合はエラーが維持されます。API エンベロープの残りの部分(スキーマ、エンドポイント、タイムスタンプ、クレームと資本クラス、人間向けページ、ソースファイルのハッシュ、クォータの行)は回答ではなくサービスの説明であり、エージェントは呼び出しのたびにそのすべてのトークン分のコストを負担します。これらの情報は保存されたレシートに含まれ、verify_receipt は include_receipt を指定すると全内容を返します。また、service_status にも含まれます。幅広い結果では、これはテキストのおよそ半分を占めます。すべてのフィールドを受け取るには CANLI_FULL_ENVELOPE=1 を設定してください。
ツールセット(トークン数)
クライアントは毎ターン、ツールの一覧全体をモデルに送信します。この一覧は各ターンのプロンプトの大部分を占めます。
検証結果は数百トークンですが、すべてのツールの一覧は数千トークンになります。ある種類のツールだけを必要とするクライアントは、CANLI_TOOLSETS(stdio)または
?toolsets=(ホステッドエンドポイント)を使って、その種類だけを一覧にできます。デフォルトでは、company と ledger を除くすべてのツールセットが対象です。company にはより適切で最新の情報を返すツール canli-fundamentals-mcp があり、ledger はファイルをマシン上に保存するためローカルでのみ利用できます。all を指定すると、両方が追加されます。get_key はキーが設定されていない場合にのみ一覧に表示されます。
| toolset | tools |
|---|---|
validate | get_key、9 つのバリデーター、audit_backtest |
receipts | verify_receipt |
company | company_financial_history |
status | service_status |
lab | backtest_strategy、summarize_series、stress_test、check_feasibility、check_leakage、placebo_test |
ledger | ledger_record_trial、ledger_summary、ledger_export(stdio のみ) |
OpenAI 形式のクライアントが一覧を送信する形式で、bench/tool_list_tokens.py を使って測定しています(トークナイザー:tiktoken o200k_base。モデルによってトークナイザーが異なるため、絶対値も異なります)。
| CANLI_TOOLSETS | tools | tokens per turn | of all |
|---|---|---|---|
| (デフォルト) | 19 | 5,978 | 85% |
| (デフォルト、CANLI_KEY 設定時) | 18 | 5,842 | 83% |
all | 23 | 7,019 | 100% |
validate | 11 | 3,658 | 52% |
receipts | 1 | 182 | 3% |
company | 1 | 273 | 4% |
status | 1 | 89 | 1% |
lab | 6 | 2,055 | 29% |
ledger | 3 | 772 | 11% |
プロバイダーは、ターンごとに変わらないツール一覧をキャッシュし、キャッシュされた部分には通常料金の一部だけを課金します(test/tool-list-stable.test.mjs は各一覧のバイト単位での同一性を維持します)。いずれにしても、一覧が小さいほどコストは低くなります。
ローカルチェックアウト
公開済みパッケージを実行する場合は不要です。このパッケージ自体の開発やテストを行う場合にのみ必要です。
cd mcp
npm ci
node src/server.mjs
上記の設定で npx -y canli-validation-mcp の代わりに node /absolute/path/to/meridian/mcp/src/server.mjs を起動するようにして、npm パッケージではなくチェックアウトをクライアントに指定します。
テスト
npm test
npm run test:package
test/*.test.mjs に対して node --test を実行します。API 独自の OpenAPI とマニフェストの例を使ったスキーマの往復テスト、キーが必要な各ツールについての成功ケース、エンベロープエラーケース、クォータ超過の 429 ケース(ネットワークの代わりに偽の fetch を使用)、すべてのツールの説明に制限に関する文が含まれていることのチェック、その文が api/_lib/limits.js と食い違っていないことのチェック、配布ファイルに em ダッシュが含まれていないことのチェックを行います。また、実際のサーバーバイナリーを起動し、ローカル HTTP スタブを使って stdio 経由で実際の MCP tools/list および callTool のハンドシェイクを行うテストもあり、配線が正しいことを想定するのではなく、実証します。
test:package は実際の npm tarball を作成し、ファイル一覧とライセンスが正確であることを確認して、一時的なコンシューマーディレクトリにインストールし、インストール済みエントリーに対して stdio テストを実行します。依存関係のインストール時には npm に接続しますが、ツール呼び出しではローカル HTTP スタブのみを使用します。パッケージの公開も、本番用 API キーの発行も行いません。
依存関係
依存関係は @modelcontextprotocol/server(固定バージョン。MCP SDK のサーバーパッケージで、依存先は @modelcontextprotocol/core と zod のみ)と zod(固定バージョン)のみです。インストールされるツリーは 4 パッケージで、0.7 以前では @modelcontextprotocol/sdk を介して約 95 パッケージが取り込まれていました。ランタイム依存関係はほかに追加されず、このパッケージがサイトのルートにある package.json、.vercelignore、api/、scripts/、js/、public/ に触れることもありません。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。