mcpField
C
Conarium

Conarium

ローカル
conarium.devセキュリティ31 日前に更新

Conarium について

Conariumは、AIコーディングエージェントからデータベースへのアクセスをポリシーで制御するセルフホスト型MCPプロキシです。保護対象のデータをマスキングし、署名付きで独立検証できるアクセス証跡も生成できます。

主な機能

  1. 01ポリシーに基づくDBアクセス制御
  2. 02個人情報と秘密情報のマスキング
  3. 03テーブル許可・拒否ルールと行数上限
  4. 04利用者別マスキングプロファイル
  5. 05署名付き改ざん検知証跡
  6. 06カバレッジ確認とDB照合

活用シーン

  1. 01コーディングエージェントに本番データを制限付きで参照させる
  2. 02アシスタントへの開示前に機密フィールドをマスキングする
  3. 03仲介したDBアクセスを監査・検証する

MCP 対応

ConariumはAIアシスタントとデータベースの間に置くMCPプロキシです。アクセスポリシーを評価し、MCPクライアントにデータを返す前に保護対象の値をマスキングします。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"dogrucanemek-alt-conarium": {
"command": "npx",
"args": [
"-y",
"@conarium-ai/core"
]
}
}
}
起動コマンドnpx -y @conarium-ai/core

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
npm@conarium-ai/core0.3.3

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

Conarium

あなたの会社のデータを見通す第三の目。

VERAX の一部で、VERAX Teknoloji が開発しています。まずは VERAX の本体からご覧ください:verax-ai/verax。姉妹プロジェクト:Tugra · Cedulon。

掲載先:npm · Glama · MCP Registry · MCP Market · LobeHub · Zenodo

セルフホスト可能で、ガバナンス機能を備えたゲートウェイです。AI コーディングアシスタント(Cursor、Copilot、Claude)が、あなたの定めたポリシーに従って実際のデータにアクセスできるようにします。保護対象の値は、外部に送信される前にマスキングされます。レシートシンクを設定すると、仲介したすべてのアクセスについて、署名付きで第三者が検証可能なレシートを記録します。conarium-init がこのシンクを設定するため、デフォルトの構成ではこの機能が有効です。

npm CI OpenSSF Scorecard OpenSSF Best Practices ウェブサイト ライセンス 早期アクセス


サイトは conarium.dev にあります。このリポジトリが製品そのものです。

続きを読む前に確認してください

以下の内容を信頼して受け入れる必要はありません。ライブのレシートチェーンがあり、アカウントも自分のデータも不要で、お使いのマシン上で公開鍵と照合して検証できます:

npm i @conarium-ai/core
curl -fsS https://conarium.dev/proof/chain.jsonl   -o chain.jsonl
curl -fsS https://conarium.dev/proof/key.pem       -o key.pem
curl -fsS https://conarium.dev/proof/key.pem.keyid -o key.pem.keyid
npx conarium-verify chain.jsonl --pubkey key.pem
note: tail truncation is not visible — this run did not see receipts deleted from the
end of the file. Pin with --expect-count, --expect-last-hash, or --anchor-check.
ok: 3 receipt(s) verified (3 with undeclared model, 3 with undeclared client)

終了コードは 0 です。3 件のレシートは、通常の読み取り、5 件のメールアドレスとカード番号がモデルに渡される前にマスキングされた読み取り、そして拒否をそれぞれ示しています。フィールドを1つでも変更すると、再計算したハッシュが保存済みのハッシュと一致しなくなり、終了コード 10 になります。署名を変更すると、終了コード 13 になります。

検証ツールは単一のファイルで、検証対象のパッケージから何もインポートしません。そのため、侵害された Conarium が検証を合格させるように仕向けることはできません。また、良い知らせを伝える前に、出力の最初の行で「検証しなかったこと」を自ら明示している点にもご注目ください。

制限事項

このリポジトリで対応していないことは、LIMITATIONS.md (トルコ語)に記載されています。日付入りの比較ページは conarium.dev/compare.html です。掲載先はここだけであり、このリポジトリには別のコピーを置いていません。

標準

draft-dogru-scitt-disclosure-evidence は個人による提出です。IETF ワーキンググループでは採択されておらず、正式な位置付けもありません。インターネットドラフトは日付入りの公開記録であり、標準ではありません。 このレシート形式を、私たちがいなくても実装できるよう公開しています。 ソースファイルは standards/ にあります。

👁️ 課題

Cursor や Copilot を本番データベースに接続すると、生のデータストリームをそのまま取り込みます。社会保障番号、クレジットカード番号、給与、そして有効なキーまで含まれます。たった一つの不正なプロンプトで、最も機密性の高いテーブルが漏えいする可能性があります。セキュリティチームは、これを許可できません。

🛡️ ソリューション:Conarium

Conarium は高性能な MCP(Model Context Protocol)プロキシとして機能します。AI アシスタントとデータベースの間に直接配置され、ミリ秒単位でポリシーを評価し、行数制限の適用と、通信中の PII(個人を特定できる情報)のマスキングを行います。

AI はコード作成に必要なコンテキストを取得し、ポリシーで保護されている値は、AI に届く前にマスキングされます。マスキングは値を隠しますが、学習できなくするものではありません。また、リクエストの言語で保護対象の列に対する述語を指定できる場合、許可されたクエリでも、その列に関する質問に答えられることがあります。その対策としてより限定的なのが protectedColumns です。この制限については、後から気付くことのないよう LIMITATIONS.md に記載しています。

主な機能
  • インライン PII マスキング: メールアドレス、ID、カード、シークレットは、モデルが一文字でも目にする前に、レスポンスストリーム内で編集されます([MASKED_PII] / [MASKED_SECRET])。
  • 許可/拒否リスト: AI がアクセスできる対象をホワイトリストに登録します。secrets テーブルと financials テーブルは見えないままです。
  • 行数制限: クエリごとに厳格な上限を設定します。数百万行のデータが気付かれないまま持ち出されるのを防ぎます。
  • 改ざん検知可能な監査台帳: Conarium を通じたすべてのアクセスについて、実行者、対象、日時、行数、判定を記録します。ハッシュチェーンにより、改ざんやチェーン途中の削除を検知できます。ただし、不可能にするわけではありません。ディスク上のファイルは削除や切り詰めが可能で、切り詰めを検知するにはファイル外部にピン留めが必要です(下記「カバレッジと照合」を参照)。PII セーフであり、生の PII がログに書き込まれることはありません。
  • 検証可能なレシート: Ed25519 署名付きで、独立して検証できるレシートです。詳細は以下を参照してください。
  • 個人別のマスキングプロファイル: AI エージェントに対してマスキングする対象と、データ管理者に対してマスキングする対象は異なります。名前付きプロファイルを使うと、特定された個人に対してマスキングを緩和でき、どのプロファイルが適用されたかはレシートに記録されます。詳細は以下を参照してください。
  • カバレッジと照合: レシートチェーンに対する署名付きカバレッジ宣言(conarium-coverage)と、データベース独自のクエリカウンターに対する双方向の照合(conarium-reconcile)を提供します。レシートでカバーされていない、DB に記録されたアクティビティを見落としたままにせず、明らかにします。
  • 100%セルフホスト可能: すべてお客様のインフラストラクチャ上で動作します。私たちが提供するものがデータを外部に送信することはありません。生の保護対象値はお客様の境界内にとどまり、AI クライアントに届くのはポリシーで許可された開示内容です。その正確なバイト列はレシートに記録されます(disclosure.hash)。データが一切外部に出ないと言うのは正しくありません。管理された開示内容をアシスタントに渡すことが、製品の役割だからです。ゲートウェイが行う、外部への唯一のリクエストはお客様のものではありません。起動時に公開 npm レジストリに新しいバージョンがあるかを問い合わせ、あれば標準エラー出力に一行表示します。お客様に関する情報は一切送信しません。識別子、設定、件数も送信しません。この機能があるのは、何週間も確認されないリモートゲートウェイが存在するためです。CONARIUM_NO_UPDATE_CHECK=1 で無効にするか、CONARIUM_NPM_REGISTRY で社内ミラーを指定してください。タイムアウトは 2 秒で、起動を妨げたり失敗させたりすることはありません。非公開の外部接続を行うガバナンス製品では、議論に勝てないため、ここに明記しています。
  • MCP ネイティブ: Cursor、GitHub Copilot、Claude Code、Codex で、すぐに使用できます。
検証可能なレシート

Conarium は、第三者が Conarium をインストールせずに単一のファイルでオフライン検証できる、携帯可能な レシート(Art. 12 / 19 形式)を出力できます。

公式の主張(範囲を広げないでください): Conarium レシートは、ファイルにまだ残っているレコードが作成後に改ざん、並べ替え、または遡及して日付変更されていないこと、また、チェーンの途中から削除されていないこと(prevHash / seq)を証明します。作成時点でレコードが正しかったことは証明しません。また、レコードが末尾から削除されていないことを、それ単体で証明することもできません。短くなった残存チェーンも内部的には整合しているためです。末尾の切り詰めを検出するには、ファイル外部からのピンが必要です。--expect-count、--expect-last-hash、OpenTimestamps アンカー、またはデータベース独自のカウンターを参照する conarium-reconcile を使用してください。

(TR) Conarium Makbuzu, dosyada hâlâ duran kayıtların oluşturulduktan sonra değiştirilmediğini, ortadan silinmediğini, yeniden sıralanmadığını ve geriye dönük tarihlenmediğini kanıtlar. Oluşturma anında doğru olduğunu kanıtlamaz. Sondan kesmeyi tek başına göremez: kalan zincir tutarlıdır, yalnızca kısadır. (/TR)

# Generate an Ed25519 keypair (private PEM + .pub.pem + .keyid sidecars).
# The .keyid sidecars are not optional: without them the verifier answers 13
# for every receipt, which reads like tampering and is not.
npx conarium-init

export CONARIUM_AUDIT_SIGNING_KEY=./audit-ed25519.pem

# init writes keys and config, not receipts: your own audit file does not exist
# until the gateway has served a query. The three commands below therefore run
# against the demo chain downloaded above, so they work as written — swap in
# your own sink (conarium.config.json → audit.sink) once it has records.

# Verify a receipt chain (exit 0 = the records *in the file* are intact)
npx conarium-verify chain.jsonl --pubkey key.pem

# Pin length / last hash if you need to catch records dropped from the end
npx conarium-verify chain.jsonl --pubkey key.pem --expect-count 3

# Check the OpenTimestamps sidecar. The demo chain ships without one, so this
# answers 14, deliberately not 0: an absent anchor is not a verified anchor.
# A sidecar that exists but is not yet confirmed → exit 0 with a warning.
npx conarium-verify chain.jsonl --pubkey key.pem --anchor-check

Go と標準ライブラリのみを使用する 2 つ目の検証ツールは、verifiers/go にあります。go build -o conarium-verify . を実行し、その後 conarium-verify と同じ引数を指定してください。契約仕様は test-vectors/ です。

アンカリングは別の手順です。npx conarium-stamp <file> でドキュメントにタイムスタンプを付与するか、npx conarium-anchor-service でチェーンヘッドのハッシュを送信してください。CONARIUM_ANCHOR_SINK=opentimestamps を設定すると、これらのツールが使用する組み込みのカレンダークライアントが選択されます。レシートの書き込み時にタイムスタンプを付与するものではありません。保留中の証明は、後から npx conarium-anchor-upgrade ./audit.jsonl.anchors.jsonl でアップグレードできます。クライアントは組み込みです(Node の crypto とカレンダーへの HTTPS 接続)。javascript-opentimestamps はインストールしません。LIMITATIONS.md を参照してください。

人ごとのマスキングプロファイル

AI エージェントにとって適切なマスキングは、データの所有者にとっては不適切です。 *「最も多くの未払いがある顧客は誰か」*と尋ねる所有者には名前が必要ですが、収益を要約するアシスタントには必要ありません。グローバルなオン/オフスイッチでこれに対応すれば、この製品唯一の実質的な保証が無効になってしまうため、マスキングは人ごとに適用されます:

{
  "policy": {
    "allowTables": ["zion.customers", "zion.orders"],
    "maskColumns": ["*.customer_name", "*.email", "*.phone"],  // default: everyone
    "maxRows": 100,

    "profiles": {
      // The controller sees customer names; email and phone stay masked.
      "controller-full": { "maskColumns": ["*.email", "*.phone"], "maxRows": 1000 }
    },
    "actorProfiles": { "alice": "controller-full" }
  }
}

保護を弱めることができる唯一の機能であるため、意図的に範囲を狭くしています:

  • プロファイルで上書きできるのは、maskColumns、maxRows、maskLabelledNamesのみです。それ以外は上書きできません。 テーブル、ツール、コネクターの権限はグローバルのままです。プロファイルで広げられるのは、アクセス可能な範囲ではなく、その範囲内で何を判読できるかだけです。 protectedColumnsはオーバーレイできません。これを解除できるプロファイルがあれば、人ごとのバックドアになってしまいます。
  • ユーザーごとのトークンのみが対象です。 共有トークンで認証されたアクターには、プロファイルは適用されません。「この文字列を持つ人なら誰でも、マスクされていないPIIを見られる」という状態を防ぐことこそ、この製品の目的です。
  • それ以外はすべてフェイルクローズです。 アクターが存在しない場合、アクターがリストにない場合、またはプロファイル名が存在しない場合は、すべてベースポリシーにフォールバックし、より緩いポリシーには切り替わりません。
  • コンテンツスキャナーは引き続き実行されます。 メールアドレス/国民識別番号/電話番号/カード番号/IBAN/シークレットの検出器は一切上書きできないため、どのプロファイルが適用されても、フリーテキスト内ではこれらはマスクされたままです。IBANはISO 7064 mod-97-10を満たす場合のみ受け入れられます。パスポートのMRZ(TD3、7-3-1のチェックデジット)はデフォルトで有効で、同様にプロファイルから無効にすることはできません。無効にするには、ベースポリシーのpolicy.detectors.mrz: falseのみを指定できます。IPアドレスの検出は、policy.detectors.ip: trueが指定されるまで無効です。プロファイルでオフにできる検出器は、名前のマスキングだけです(maskLabelledNames: false)。これは、コントローラーが自身の顧客リストを読むことが、この機能の目的だからです。
  • レシートには、どのプロファイルが適用されたかが記録されます。 policy.idは署名付きハッシュ内でconarium.policy/<profile>になります。緩和されたプロファイルのもとで行われたアクセスを、後から完全にマスキングされていたかのように提示することはできません。これにより、監査の説明責任が保たれます。目的は「誰にもPIIを見せない」ことではなく、「すべてのアクセスを管理し、その証拠にどのルールが適用されたかを記録する」ことです。
自由記述の名前

それ以外の識別子には、どれも形があります。メールアドレスには@があり、国民IDにはチェックサムがあり、カードには桁数があります。正規表現で判定でき、その判定は再現可能です。名前には形がないため、それを検出できるのはmaskColumnsだけでした。そのため、自由記述のnoteに入力された名前は、そのままモデルに渡っていました。

誠実に対処できる範囲について、次の2つの決定論的な処理でそのギャップを埋めます。

処理検出条件例
引き継ぎこのポリシーが、いずれかの列ですでにマスクしている値であるcustomer_nameがマスクされるため、note: "Ayşe Demir called"もマスクされます。行をまたいで適用されます
ラベル付きテキスト自体に、敬称やフィールドラベルなどの印があるSn. Ahmet Yılmaz、Yetkili: Ayşe Demir、customer: John Smith

意図的に行わないこと:文章中に単独で現れる名前は検出しません。「Ahmet called yesterday」はそのまま通過します。これを検出するには、モデル、辞書、信頼度スコアを使ったNERが必要です。このゲートウェイのすべての判定は、私たちを信頼しない人でもルールだけから再現できるようにすることを目指しています。確率的なマスカーは、確率的な「判断記録」にもなります。Presidioベースのものなど、実際にNERを使うツールは、より多くの種類のエンティティを検出できますが、その代わりに信頼度しきい値を必要とします。どちらが優れているとも限りません。監査担当者がどちらの方式を使っているか把握できるよう、ここではこの方針を明示しています。

**コンテンツスキャナーで検出されないもの――欠落ではなく、設計上の仕様です:**番地と、単独で現れる名前です。地名辞書がなければ、住所検出器は「Atatürk Caddesi No:15」と「Atatürk Barajı」を区別できません。名前検出器は、Deniz/Güneş/Umutを人名と一般的な語のどちらとして読むべきか判別できません。どちらにも辞書かモデルが必要ですが、このゲートウェイの判定は決定論的です。こうしたギャップは、maskColumns(列名による指定)とconarium-suggest-policy(設定ファイルには書き込まない、名前に基づく推測)で補ってください。

IPアドレスは、有効にした場合に検出されます(policy.detectors.ip: true)。サーバーのIPアドレスは常に個人データとは限らず、無効にできないマスクはSOC業務の妨げになるため、デフォルトでは無効です。1.2.3.4は構造上、有効なIPv4アドレスです。検出器が有効であれば、バージョン番号のつもりであってもマスクされます。日付(13.08.2026)や金額(1.250,00)はIPv4ではありません。

自由記述内のパスポート番号は検出されません。**MRZは検出されます:**TD3形式の2行で各44文字、1文字目がPで、7-3-1方式のチェックディジットを使います。チェックサムが一致しなければMRZではないため、そのまま残ります。TD1/TD2は実装されていません。

HTMLの&#64;/&#x40;、JSONの\u0040、および%40は、メールアドレス形式のトークン内にある場合にマスクされます。単独の5&#64; storeやC:\path\u0040abcはそのまま残ります。デコードは1回だけ行います。&amp;#64;はさらにデコードされません。

同じ行にある、似た名前の2つのフィールド(tckn_1/tckn_2)に分割されたTCKNは、連結した値のチェックサムが一致すればマスクされます。無関係な列は結合されません。

ゼロ幅文字、全角数字/@、およびUnicodeのダッシュは、検出器にかける前に除去またはASCIIに変換されます。この処理は汎用的な文字コードデコーダーではありません。フィールド内にある、ラップされたbase64/hexのトークンは、デコード後に既存の検出器で検出される場合にのみマスクされます。

スキャン長。1つのテキストフィールドがpolicy.scanCharCap(デフォルトは16 384、環境変数CONARIUM_SCAN_CHAR_CAPで上書き可能)を超えると、識別子が含まれていなくても、フィールド全体が[MASKED_PII]に置き換えられます。スキャナーはスキップされません。スキップすると、長いメモ、JSON blob、ログ行がマスクをすり抜ける手段になってしまうためです。これはユーザビリティの設定です。この値を大きくするとスキャンコストが二次的に増加します。上限のないメールアドレス正規表現に上限を設ける前は、40 KBの英数字フィールドの処理に約1秒かかっていました。maskedCountには、判定が行われたことが記録されます。

引き継ぎ処理では、3文字未満の値は無視されます(2文字の値はどこにでも一致し、出力をひどく損なうおそれがあります)。また、Unicodeの単語境界で照合するため、Ali onayladıのAliはマスクされますが、Kaliteの中のAliはマスクされません。

網羅性と照合(バイパス検出)

レシートは、ゲートウェイを通過したものを証明します。照合では、データベースに何が記録されているかを確認して比較します。

どちらのコマンドも入力を自動生成せず、conarium-init も入力を作成しないため、入力を用意するまではどちらも 20(入力がありません) を返します。declaration.json は、ご自身で作成する期間と範囲の宣言です(フィールド名は docs/RECEIPT-SPEC.md に記載されています)。2 つのスナップショットは scripts/pg-snapshot.sql から取得します。

# One-sided: signed coverage declaration over a period + declared scope
npx conarium-coverage ./declaration.json --pubkey ./audit-ed25519.pub.pem --receipts ./receipts.jsonl

# Two-sided: reconcile the DB's own per-role query counters against receipts.
# Snapshots come from pg_stat_statements (scripts/pg-snapshot.sql), taken at
# window start and window end with a dedicated DB role per gateway instance.
npx conarium-reconcile --before before.json --after after.json --receipts ./receipts.jsonl
# exit 0  = every DB query pattern in the window is attributable to a receipt for
#           the same table (object attribution, not per-statement coverage —
#           see LIMITATIONS.md)
# exit 40 = the DB recorded activity no receipt covers — the gateway may have
#           been bypassed, or the receipt sink failed

この表現は意図的なものです。不在の場合は 「アクセスは記録されていません」/「レシートに記録されていません」 と報告し、「アクセスは発生しなかった」とは決して報告しません。記録がないことには本質的に曖昧さがあり、そうでないかのように装うツールは、監査担当者に嘘をついていることになります。

リリース当日に、自社の本番 ERP に対して実行した結果です。実際に自社でバイパスを行い、ツールが検出しました。 docs/dogfood/2026-08-06-reconcile.md。

スキーマ全体、終了コード、既知のギャップについては、docs/RECEIPT-SPEC.md をご覧ください。

副署(自分ではできない部分)

レシートは、ゲートウェイを通過したものを証明します。照合は、ゲートウェイを迂回したものがないことを証明します。どちらも自分で管理し、自分でホストし、自分の鍵で署名するものです。まさに監査担当者が割り引いて考える点です。記録を保持し、自分で署名し、自分で保管しているからです。同じチェーンヘッドに第二者を加えることで、副署はこの問題に答えます。

サービスはこのパッケージに含まれているため、自分で実行して自分のチェーンヘッドに署名できます。これは 2 人目の内部管理者には役立ちますが、上記の異議への対処にはなりません。価値をもたらすのは、署名者が自分ではないことです。

# Run the endpoint. It refuses to start without a signing key or a token file:
# with neither present the three lines below exit 2 and name what is missing,
# which is the intended answer, not a failed install. Generating both is in
# deploy/anchor-service/.
CONARIUM_ANCHOR_TOKENS=./anchor.tokens.json \
CONARIUM_ANCHOR_SIGNING_KEY=./anchor.pem \
CONARIUM_ANCHOR_BASE_URL=https://anchor.example.com \
npx conarium-anchor-service

# Verify a countersignature you were given — offline, no network, no package.
# record.json is what the endpoint returned to you; without it, exit 20.
npx conarium-countersign-verify ./record.json --pubkey ./anchor.pub.pem
# exit 0  = signature valid (and inclusion valid if a proof or --log-url was given)
# exit 13 = signature invalid / unknown keyId
# exit 14 = inclusion proof present and false
# exit 15 = the log could NOT be checked — deliberately not the same as 14

ログはハッシュチェーンです。エントリーは追加されるだけで書き換えられることはなく、OTS タイムスタンプは各送信ではなくチェーンヘッドを対象とします。副署が証明すること、そして同じくらい重要な、証明しないことについては、署名鍵が漏えいした場合の影響とともに docs/COUNTERSIGN.md に記載しています。

Pro はホスト型の副署サービスです。自分以外の誰かがチェーンヘッドに署名します。月額 $20 または年額 $200($40 お得)。 1 期間分で、サブスクリプションではありません。 自動更新はされません。期間が終了するとアクセスできなくなりますが、再度購入できます。理由を問わない 14 日間の返金保証があります。それ以降は日割り返金はありません。該当する場合は VAT が加算されます。チェックアウトはまだ開始していません。conarium.dev/buy は、決済が開始されるまでウェイトリストのフォームにリダイレクトされるため、これらは本日購入できる価格ではなく、公開済みの価格です。上記のバイナリはご自身で実行するもので、Pro は 2 人目の署名者です。0.2.16 からパッケージに含まれています。VERAX が運用するエンドポイントは、まだ顧客向けに公開されていません。Business は引き続きウェイトリストでの受付中です。定期照合、網羅性アラート、署名付き期間レポートは契約に含まれていますが、まだ提供されていません。

この形式を自分で実装する

レシートはこの実装よりも長く使われることを想定しているため、適合性ベクトルが付属しています。13 個の固定ケースと、機械可読マニフェストが test-vectors/ に含まれています。

npm run test:vectors     # our verifier against the frozen cases

各 receipts.jsonl をご自身の検証ツールに渡し、manifest.json に記載された引数を指定して、終了コードを比較してください。expected-hashes.json には正規 JCS → SHA-256 ハッシュが記載されているため、意図的に公開していない当社の秘密鍵がなくても、ご自身の正規化を確認できます。

このリポジトリでは、最初の実行時に 2 つの問題が見つかりました。構造的に無効なレシートを 改ざん済み と報告するスキーマチェックと、署名なしレシートに関する当社の誤った想定です。どちらも現在はケース 007 と 008 として固定されています。

チェーンへのアンカリング(任意)

conarium-stamp はファイルを OpenTimestamps カレンダーにアンカリングし、 conarium-anchor-upgrade はビットコインのブロック高が確定した時点でそれを補完します。 ほとんどのセットアップでは、この2つで十分です。

複数のゲートウェイ向けに、あるいは監査担当者に固定 URL を渡すために、 アンカリングを小規模なサービスとして公開したい場合は、 bin/conarium-anchor-service.mjs がその一例です。 これはハッシュを送信し、証明を保持し、永続パスで生の .ots を提供し、 タイマーで保留中のアンカーをアップグレードします。

これはご自身で実行するコードであり、私たちが運用するサービスではありません。 登録できるホステッドインスタンスはありません。また、第三者が参照用の OpenTimestamps クライアントで検証し、サービスを完全に無視できるよう、生の証明も提供します。 信頼しなければならないアンカリングエンドポイントでは、アンカリングの目的が損なわれます。

署名はフェイルクローズ方式です。CONARIUM_AUDIT_SIGNING_KEY および/または CONARIUM_AUDIT_HMAC_KEY を設定するか、使い捨てのセットアップでは明示的に CONARIUM_AUDIT_UNSIGNED=1 を設定してください。 鍵のローテーションでは、以前の公開 PEM を CONARIUM_AUDIT_TRUST_PUBKEYS に保持してください(区切り文字は , または ; です)。 最初の署名付き監査行以降、すべての後続行に sig が含まれている必要があります。

類似プロジェクトにおける本プロジェクトの位置づけ

Conarium は、AI のアクティビティについて署名付きの検証可能なレシートを生成する最初のプロジェクトではありません。Acta、 Emilia Protocol、 AuthProof、 Agent Receipts、 Invariant SVRは、いずれもこの種の機能を実現しており、標準化の面では一部が私たちより先行しています。Acta と Emilia はどちらも IETF Internet-Draft を公開しています。関連研究として、Aegon(arXiv 2604.06693)、Decentralised Trust Layers(ACM Web Conf 2026)、署名付き同意記録に関する ISO/IEC TS 27560:2023 があります。

それらのレシートが証明するのは、エージェントが行ったことです。Conarium のレシートが証明するのは、モデルが見ることを防がれたものです。データをマスキングするコンポーネントが、記録に署名するコンポーネントと同じだからです。ここでは、強制適用と証拠は一つの部分であり、相互に整合させる必要のある二つのシステムではありません。

私たちが主張するのは、次の三つすべてを組み合わせた実装として、把握している限り Conarium だけだということです。(1)インラインでの強制適用(ポリシー+マスキング)、(2)その強制適用を示す、持ち運び可能でオフライン検証可能なレシート、そして**(3)カバレッジの照合** — データベース自体のクエリーカウンターをレシートチェーンと照合し、ゲートウェイを迂回したアクセスを見えないままにせず、表面化させます。強制適用を伴わないレシートの署名は一般的です。持ち運び可能なレシートを伴わない強制適用も一般的です。両者をデータソース自身の記録と照合する部分は、他では見つけられていません。実際に稼働中の企業の ERP でエンドツーエンドに測定した結果です — 121,374 件のレコード、121,366 件の ID をマスキングし、485,496 個のフィールドをマスキング、モデルへの漏えいはゼロでした(Governance Report 001)。

この数値が示すものと、示さないもの。 これは自社の ERP に対するバッチ実行から得られたもので、その裏付けとなるのは、123 行のハッシュチェーン化された監査ファイルです。算術を自分で再計算でき、17 日後にチェーンを再検証しています。裏付けとなっていないのは、レシートチェーンです。この実行で出力されたのは監査エントリーであり、署名付きの持ち運び可能なレシートではありません。また、実行者はバッチサービスの ID であり、人ではありません。したがって、「その 485,496 個のフィールドについてレシートを見せて」と尋ねられた場合、正直な答えは、それらは存在しない、です。レシートチェーンは、これとは別の、はるかに小規模な測定です。規模とオフライン検証可能性は、ここでは別々の主張です。皆さんに見つけられる前に、私たち自身でその境界を明示したいと考えています。この仕組みは、私たちを信頼しなくても検証できます。この特定の数値は私たち自身による測定値であり、Governance Report 001にはその限界を記載しています。

この主張に意図的に留保を付けている理由は、docs/PRIOR-ART.mdにその根拠があるからです。11 件のプロジェクト — 2026 年 8 月 6 日に 10 件を確認し、8 月 19 日に Vaara を追加 — それぞれが備えているもの、最も近い先行研究(この隔たりを私たちより的確に示したSello / Notarized Agents)、そして検証できなかった 9 項目を記載しています。三つすべてを組み合わせた実装をご存じでしたら、イシューを作成してください。内容を訂正します。

⚠️ Vaara の行によって、この主張は裏付けられたのではなく、範囲が狭まりました。このプロジェクトは設計文書でカバレッジの照合を仕様として定めています。しかし、ツリーを検索しても、それを実行するコードは見つかりませんでした。そのため、該当行には「仕様に記載、実装は見つからず」とあります。このアイデアは私たちだけのものではありません — この調査で確認できた範囲では、実行可能なコードは今も私たちだけです。このファイルは、表の上でもそのように述べています。


🏗️ アーキテクチャ(トライフェクタ)

Conarium は、三つの柱の間で力の均衡を保つ、厳格な三分構成のアーキテクチャで動作します。

graph LR
    A([AI Assistant\nCursor / Copilot]) -- "MCP Query" --> B{The Gateway\nConarium Proxy};
    B -- "Intercept & Parse" --> C[The Engine\nGovernance & Regex];
    C -- "Execute Query" --> D[(Your Database\nPostgres / SQL Server / Oracle)];
    D -- "Raw Data" --> C;
    C -- "Mask & Cap" --> B;
    B -- "Sanitized Data" --> A;
    C -. "Write Log" .-> E[The Ledger\nAudit DB];
    
    style A fill:#05070f,stroke:#5a8cff,stroke-width:2px,color:#fff
    style B fill:#05070f,stroke:#ff6f80,stroke-width:2px,color:#fff
    style C fill:#05070f,stroke:#6fe0e0,stroke-width:2px,color:#fff
    style D fill:#05070f,stroke:#f2d79a,stroke-width:2px,color:#fff
    style E fill:#05070f,stroke:#838dad,stroke-width:2px,color:#fff
  1. ゲートウェイ: LLM アシスタントとスムーズに通信するプロキシです。
  2. エンジン: JSON ポリシー、正規表現スキャン、行数上限をミリ秒単位で評価します。
  3. 台帳: 仲介するすべてのクエリーと判断を記録する、改ざんの痕跡が残る監査ログです。

データベースなしで試す

npx -y --package=@conarium-ai/core conarium --demo

データベースではなく、サンプル行を使ってローカル MCP サーバーを起動します。許可されたテーブルからは、行がゲートを出る前にメールアドレスとカードの値がマスキングされて返されます。拒否されたテーブルへのアクセスは拒否され、行数の上限が適用されます。許可および拒否された呼び出しは、署名付きチェーンに記録されます。付属のコネクターはどれも使用されません。

{
  "mcpServers": {
    "conarium": {
      "command": "npx",
      "args": ["-y", "--package=@conarium-ai/core", "conarium", "--demo"]
    }
  }
}

🚀 クイックスタート

# 1. Install
npm i @conarium-ai/core

# 2. Write a fail-closed skeleton (config + Ed25519 pair + .keyid sidecars)
npx conarium-init
export CONARIUM_AUDIT_SIGNING_KEY="$PWD/audit-ed25519.pem"

# 3. Check the install before trusting it. Until step 4 points the config at a
#    reachable DSN, doctor reports the placeholder host unreachable and exits 1.
#    That FAIL is the check working, not the install being broken — it is the one
#    thing a gateway must not be quiet about, because it keeps running with zero
#    connectors and looks healthy while serving nothing.
npx conarium-doctor

# 4. Point the generated conarium.config.json at your read-only DSN,
#    fill policy.allowTables, then run the governed MCP gateway
npx conarium

ステップ 3 は飾りではありません。設定ファイルがなくてもゲートウェイは停止せず、コネクターがゼロの状態で起動して、何も制御しません。また、接続に失敗したコネクターはエラーとして通知されず、ログに記録されます。conarium-doctor はこの両方を明示し、問題がある場合はデプロイをブロックできるように終了コード 1 を返します。また、シークレットは決して出力しないため、その出力は安心して課題に貼り付けられます。

ソースから実行する場合
git clone https://github.com/dogrucanemek-alt/conarium.git
cd conarium
npm install && npm run build
# The repository already ships a conarium.config.json, so init refuses rather
# than overwrite it (exit 1). Pass --force only if you want it regenerated.
node bin/conarium-init.mjs --force
node bin/conarium-doctor.mjs --no-net
npm start

conarium-init は --force を指定しない限り、既存ファイルの上書きを拒否します。秘密鍵を出力することはなく、そのパスのみを表示します。

コンソールのデスクトップショートカット

ポリシーエディターは npx conarium-console です。引き続き 127.0.0.1 にバインドされ、トークンが必要です。以下の 2 つのコマンドは、デスクトップに起動用の入り口を追加するだけです。

npx conarium-console --install-shortcut
npx conarium-console --uninstall-shortcut
Windowsデスクトップ上の .lnk(コンソールウィンドウは最小化)
macOS~/Applications/Conarium Console.app
Linux~/.local/share/applications/conarium-console.desktop

ダブルクリックすると同じコンソールが起動し、ポートがリッスン状態になるまで待ってからブラウザーを開きます。トークンは URL に含まれません。代わりに、1 回限りの nonce(≤30s)をセッション Cookie と交換します。同じ名前のショートカットがすでにある場合は、上書きせずに -2 のサフィックスを付けます。

ランチャーが ~/.conarium/console.token(0600 で作成)からトークンを読み取れるように、--install-shortcut の前に CONARIUM_CONSOLE_TOKEN をエクスポートしてください。ショートカットファイル自体にトークンは含まれません。

ショートカットでは、同じ SVG から生成された assets/conarium-mark.ico / .icns / -512.png を使用します。これらのファイルが見つからなくてもショートカットは作成され、コマンドが警告を表示します。

コンソールの Makbuzlar タブには、audit.receiptSink から取得した署名付きレシートが新しい順に一覧表示され、demo.conarium.dev/proof と同じレシート HTML が表示されます。ハッシュチェーンを検証し、zincir sağlam または kırık (satır N) と表示します。シンクが空または未設定の場合はその旨を表示し、サンプルレシートを捏造することはありません。Audit Logs は引き続き署名のないテスト用の履歴であり、レシートではありません。

パッケージが npm に公開されると、同じバイナリーが tarball(conarium-init、conarium-doctor、conarium-verify、conarium-suggest-policy)に含まれます。それまでは、上記のようにこのリポジトリから実行してください。

バグを報告する前に:doctor を実行する

conarium-doctor は気付かないうちに失敗する項目をチェックします。特に重要なのは次の 2 つです。設定ファイルがなくてもゲートウェイは停止せず、コネクターがゼロの状態で起動して何も制御しません。また、接続できないコネクターはエラーとして通知されずログに記録されるため、何も提供していないのにプロセスは正常に見えます。さらに、<pubkey>.keyid サイドカーファイルがない場合も検出します。このファイルがないと、すべてのレシートが 13 として検証されます(改ざんのように見えますが、実際には違います)。

問題がなければ終了コード 0、問題があれば 1 を返すため、デプロイをブロックできます。シークレットは決して出力しません。パスワード、トークン、鍵の情報は形式のみを報告します(postgresql://[email protected]:5432/prod (password set, not shown))。そのため、出力は安心して課題やメールに貼り付けられます。

Conarium は stdio 経由で MCP を使用するため、AI アシスタントがコマンドとして起動します。MCP クライアントの設定(例:Cursor)に以下を追加してください。

{
  "mcpServers": {
    "conarium": {
      "command": "npx",
      "args": ["-y", "--package=@conarium-ai/core", "conarium", "--config", "/path/to/your/conarium.config.json"]
    }
  }
}

⚙️ 設定(ポリシー・アズ・コード)

シンプルな conarium.json ポリシーファイルを使ってアクセスを制御します。

{
  "maxRows": 50,
  "allowTables": ["public.customers", "public.orders"],
  "denyTables": ["public.secrets", "public.financials"],
  "maskColumns": ["email", "ssn", "*.card", "*.api_key"],
  "protectedColumns": ["*.email", "customers.tckn"],
  "allowConnectors": ["postgres-main", "docs"]
}

allowTables に含まれていないものはデフォルトで拒否されます。一致した maskColumns は、データがモデルに届く前に [MASKED_PII] でマスキングされます。

protectedColumns でも同じ glob 構文を使用します。すべてのパターンは結果でもマスキングされます。さらに、その列は述語(WHERE、HAVING、JOIN … ON、ORDER BY、GROUP BY)または派生した SELECT 式に含めることができず、クエリは拒否されます。単独の SELECT email は引き続き許可され、マスキングされた状態で返されます。このフィールドを省略した場合、動作は変わりません。プロファイルでこのフィールドを設定することはできません。 mssql / oracle は、このフィールドが空でない場合、起動を拒否します。これらのゲートは述語の位置を調べることができず、この製品は強制できないルールを適用すると主張しないためです。

policy.dialect は、query ツールが使用する SQL ゲートを選択します。postgres(省略時のデフォルト)、mssql、または oracle を指定します。これはオペレーターによる宣言であり、Conarium がステートメントから方言を推測することはありません。タイプミスや mysql は設定エラーとして拒否されます。

コネクターはフェイルクローズです。 allowConnectors は厳密な許可リストです。 欠落しているか空の場合、許可されるコネクターはありません(以前は空の リストは「すべて許可」を意味していました)。コネクターを設定する場合は、ここに 列挙する必要があります。列挙されていない場合、サーバーは起動を拒否し、追加すべき フィールドを正確に通知します。 denyConnectors は引き続き allowConnectors より優先されます。

policy.detectors と policy.scanCharCap

身元情報検出器(TCKN、カード、IBAN、メール)は無効化できません。無効化を試みる設定(detectors: { tckn: false })は、読み込み時に拒否されます。これが製品の方針です。銀行が JSON ファイルから無効化できるマスキングは、マスキングとは言えません。

キーデフォルト理由
detectors.ipfalseサーバー IP が常に個人データとは限りません。無効化できないマスキングでは、SOC の「このアドレスからのリクエストはいくつか?」という確認ができなくなります。その列が実際にクライアントのアドレスである場合に有効にしてください。
detectors.mrztrueパスポートの MRZ は身元情報であり、チェックディジットがあります。渡航書類を扱わない場合は、ベースポリシーで無効にしてください。
scanCharCap16384使いやすさのための設定です。この長さを超えるフィールドはスキップされず、全体が置き換えられます([MASKED_PII])。環境変数 CONARIUM_SCAN_CHAR_CAP で上書きできます。値を上げるとスキャンコストは二次的に増大します。上限は 1 048 576 です。
{
  "scanCharCap": 32768,
  "detectors": { "ip": true }
}
policy.customPatterns

組み込みの検出器が認識しない形式(銀行の顧客番号や住宅口座コードなど)は、同じスキャナーに追加ルールとして登録できます。これは別のマスキング経路ではなく、maskColumns を置き換えるものでもありません。

各ルールには、名前(レシートに記録されるもの)、パターン、任意の列 glob、マスクラベルが必要です。任意の sample は、conarium-doctor がコンパイル済みパターンとの照合に使用します。コンパイルが成功しても、パターンが実際に一致するとは限りません。壊れたパターンや ReDoS のおそれがあるパターンは設定時に拒否されます。パターンとサンプルがログ、レシート、または doctor の出力に書き込まれることはありません。

{
  "customPatterns": [
    {
      "name": "teb-hesap",
      "pattern": "HSP-[0-9]{8}",
      "columns": ["*.hesap_no"],
      "label": "[MASKED_HESAP]"
    }
  ]
}

量指定子には上限が必要です({8}、{4,12})。+、*、入れ子のグループ、先読み・後読みは読み込み時に拒否されます。ルールで指定するのは、すでに認識している形式です。新しい形式を作り出すものではありません。

conarium-suggest-policy --sql schema.sql は、列名(*name*、*address*、*tckn*、…)から推測した maskColumns を出力します。設定ファイルには書き込みません。出力の1行目にその旨が記載されます。

🗺️ ロードマップ

Conarium は早期アクセス段階です。現在の実装状況を正直にお伝えします。

現在提供中: ガバナンス対応の MCP ゲートウェイ(stdio + HTTP)· 自由文中のラベル付き氏名を含む、決定論的な PII マスキング · 許可/拒否 + 行数上限 · 人ごとのマスキングプロファイル · 改ざん検知可能なハッシュチェーン監査台帳 · レシート保存先の設定後、アクセスごとに Ed25519 署名付きレシートを発行(オフライン検証ツール付き) · 署名付きカバレッジ宣言 · データベース独自のカウンターとの双方向照合 · OpenTimestamps によるアンカリングとオプションのアンカリングサービス · 適合性ベクトル · SQL ゲート:Postgres、Microsoft SQL Server、Oracle(MySQL は未実装です。Oracle のシノニムとデータベースリンクは解決されません。LIMITATIONS を参照) · Postgres、Supabase、ドキュメント、OpenAPI、Jira、Slack のコネクター · npx 経由の conarium-init / conarium-doctor(@conarium-ai/core)。

次の予定: 同意の紐付け(仕様公開済み、コード未実装 — まず特許レビューを実施) · レシート形式の独立した第 2 の実装 · オペレータートークンのマップではなく、ID プロバイダーに紐付けられたユーザーごとの ID。

意図的に予定していないもの。そのため、これらを待つ必要はありません。

  • LLM ベースの「セマンティック」マスキング。 ゲートが決定論的なのは意図的です。確率的なマスキングでは、レシートも確率的になり、それはレシートとは呼べません。
  • ホスト型クラウドコンソール。 セルフホスト可能であることを掲げています。ホスト型コンソールを提供すると、当社が関与しないとお伝えしているデータ経路に当社が入ることになります。
  • 当社は SOC 2 を取得しません。 現段階では、組織の認証よりも、独立した侵入テストと実装レベルの保証を優先します。これは当社の認証についてであり、お客様の認証についてではありません。署名付きレシートとカバレッジ宣言は、お客様自身の監査人に提示できます。それが特定の監査要件を満たすかどうかは、お客様と監査人との間で判断してください。当社がお客様のデータを保持することになった場合、または認証そのものが契約の条件になった場合は、まずこの方針を見直します。
  • 上記の OpenSSF Best Practices バッジは自己認証であり、監査ではありません。 67 項目の質問に回答し、その回答を公開しました。プロジェクト 14160 で誰でも確認でき、各項目をこのリポジトリと照らし合わせられます。回答が反証可能であることには価値がありますが、独立した第三者が確認したこととは異なります。67 項目のうち 3 項目は「該当なし」とし、その理由を記載しています。隣の Scorecard バッジは機械による測定結果であり、プルリクエストを第 2 の承認者なしでマージしているため、Code-Review のスコアは 0 です。

既知の不足事項:LIMITATIONS.md、上記の README、 docs/RECEIPT-SPEC.md、 docs/BENCHMARK.md、 docs/API-STABILITY.md。

📜 ライセンス

MIT — 検証ツール、照合ツール、アンカリングサービスも含め、すべてが対象です。有料プラン向けに提供を保留している機能はありません。コードは MIT ライセンスです。conarium.dev が販売するのは、第 2 の署名者(Pro)と、将来的には運用済みカバレッジ(Business — まだ提供されていません)であり、コードへのアクセスではありません。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。