BankWeave について
BankWeaveは、AML調査向けの読み取り専用MCPサーバーです。FalkorDBのグラフクエリを通じて、銀行横断の資金リングや資金経路、案件、証拠付きの主張を調べられます。
主な機能
- 01FalkorDBの読み取り専用ツール17種
- 02銀行横断のリング・経路検索
- 03案件と主張の証拠確認
- 04ベクトル・音声検索
- 05制限付きCypher実行
活用シーン
- 01銀行横断のマネーロンダリング調査
- 02案件に関わる取引経路の追跡
- 03主張を裏付ける証拠の確認
MCP 対応
streamable HTTPまたはstdioで、読み取り専用ツール17種、プロンプト3種、リソース2種をMCPクライアントに公開します。案件、主張、リング、経路、検索、トリアージ、制限付きCypherを扱います。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://bankweave-api.onrender.com/mcpclaude mcp add --transport http lsudoko-bankweave https://bankweave-api.onrender.com/mcp{"mcpServers":{"lsudoko-bankweave":{"type":"http","url":"https://bankweave-api.onrender.com/mcp"}}}Cursor で開く{"servers":{"lsudoko-bankweave":{"type":"http","url":"https://bankweave-api.onrender.com/mcp"}}}VS Code で開く{"mcpServers":{"lsudoko-bankweave":{"type":"http","url":"https://bankweave-api.onrender.com/mcp"}}}{"mcpServers":{"lsudoko-bankweave":{"serverUrl":"https://bankweave-api.onrender.com/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ghcr.io/lsudoko/bankweave-mcp:3.0.0stdioツール
詳細
BankWeave
多数の銀行、ひとつのリング、すべての主張に証拠を。

BankWeave は、FalkorDB を共有の頭脳として、複数の銀行にまたがるマネーロンダリングのアラートを調査する AI エージェントのチームです。無実のアラートをすばやく解消し、単独の銀行では発見できないマネーロンダリングのリングを明らかにし、クリックしてたどれるグラフパスですべての結論を裏付けます。また、各判断を支える独立した根拠がいくつあるかを把握し、そのうちのひとつが失われたことに気づき、証明できない報告書の提出を拒否します。
- トラック: 01 つながったデータに基づいて行動するエージェント(主要)、02 エージェントのメモリと連携、最優秀ブログ記事
- 稼働中のデプロイ: https://bankweave.vercel.app(Vercel 上の UI)・API https://bankweave-api.onrender.com/docs(Render)・グラフ:FalkorDB Cloud(ap-south-1)
- MCP レジストリ:
io.github.LSUDOKO/bankweaveとして公開(v3.0.0、ストリーミング可能な HTTP) - Claude からの利用:
claude mcp add --transport http bankweave https://bankweave-api.onrender.com/mcpを実行するか、stdio パッケージとして利用できます:claude mcp add bankweave -- docker run -i --rm ghcr.io/lsudoko/bankweave-mcp(FalkorDB の読み取り専用ツール 17 個。それぞれ実行した Cypher を返します。docs/MCP.md) - FalkorDB 公式ブラウザーでの証拠: Cloud インスタンスで動作するリング、PageRank、カードタップ、SAR の来歴、ベクトル検索のスクリーンショットと録画
- 5 分で理解する: 3D 解説(8 つのシーン、それぞれが FalkorDB の呼び出し 1 回)とグラフエクスプローラー(実行可能な 12 個のプリセット)
- デモ動画: YouTube で視聴、ランディングページで視聴、またはMP4 をダウンロード(ナレーション付き、字幕焼き込み済み):課題のホワイトボード解説、課題を扱った映像の締めくくりに続き、FalkorDB Cloud 上の実製品、ハードウェアのエッジ、MCP、FalkorDB 公式ブラウザーを紹介します。自分でビルドするには、
video/build.py --longを実行します - ブログ記事:
docs/BLOG.md実データで稼働中です。 FalkorDB Cloud 上の本番インスタンスには、IBM のラベル付き AML 取引データが 6 行の銀行分保管されています。内訳は、口座 3,024 件、送金 24,990 件、グラフ 36 個(6 行の銀行グラフ、ノード 10,178 個とエッジ 37,448 本を含むコンソーシアムグラフ、27 個のケースグラフ、エージェントメモリ、タイポロジーナレッジベース)です。エージェントは 1,208 件のアラートをトリアージしました。そのうち、理由を明示して 1,113 件を解除し、95 件をケースにエスカレーションしています。各ケースには、主張、証拠、証拠ごとの Cypher クエリ、来歴に基づくレポート、署名済みの Merkle シールが含まれます。
BankWeave は、FalkorDB Graph Hacks 向けに構築された独立プロジェクトです。FalkorDB の製品ではなく、FalkorDB の QueryWeaver や Weights & Biases Weave とは無関係です。
課題
- アラート疲れ。 ルールベースの取引モニタリングでは、文脈を考慮せずに個々のシグナルを検知します。業界の情報源によると、アラートの 85〜95%は誤検知です。
- 可視性の分断。 銀行が確認できるのは、自行が関与する取引のみです。資金洗浄の手口は複数の金融機関にまたがるため、各銀行が見る範囲では問題がないように見えます。
- 証明できないレポート。 疑わしい取引の報告(SAR)は、その内容を裏付ける必要がありますが、現在、その根拠は手作業でまとめられています。
BankWeave の機能
- IBM の公開 AMLworld 資金洗浄データセットを、銀行ごとに分離した 1 つの FalkorDB グラフと、ソルト付きハッシュ化口座 ID で各グラフをつなぐコンソーシアムグラフに読み込みます。
- エージェントチーム(オーケストレーター、トリアージ、調査担当、懐疑担当、レポーター、および独立した監査担当とアーカイバー)が、グラフに保存されたタスク用ブラックボードを通じてアラートキューを処理し、FalkorDB ネイティブのアルゴリズムをツールとして呼び出します(MCP 経由でも提供されます)。
- 問題のないアラートは理由とともに数ミリ秒で解除され、疑わしいアラートはそれぞれ独自の
case_<id>グラフ内のケースになります。そこでは、主張が証拠、および証拠を生成したクエリにリンクされています。 - 2026 年の 3 本の論文に基づく信頼レイヤーによって、エージェントの適正な動作を保ちます(下記参照)。
- すべてのアクションを人間が承認します。すべての処理結果はスコアボード上で IBM のラベルと照合されます。
3.0 の新機能
| 領域 | できること | 場所 |
|---|---|---|
| コンソール | 14 ページすべてをライブ件数付きで一覧表示するサイドバー、ページとケースを検索できる Ctrl K 検索、全ページ共通のカードシステム:ライブクエリによる統計カード、ステータスチップ、角丸のグラフ | すべてのページ |
| ダッシュボード | オープン中のケース、判定済みアラート、独立した請求、担当者の対応待ちアクション、最新ケースの請求サポート、次の承認、エージェントチーム、アラートトリアージゲージ、FalkorDB Cloud のレイテンシ、グラフ、メモリ | /command |
| グラフエクスプローラー | FalkorDB ブラウザー風のページです。グラフを選択し、Cypher を記述し(GRAPH.RO_QUERY、書き込みはエンジンによって拒否されます)、ラベル付きの Obsidian 風フォースグラフ、ホバーで表示される近傍、プロパティパネルを確認できます。12 個のプリセットがあり、それぞれ実データ上での FalkorDB の機能を示します:銀行横断のリング、algo.pageRank、algo.labelPropagation、algo.wcc、algo.SPpaths、Double Metaphone 全文検索、HNSW ベクトル KNN、共有 ID、エージェントによるアラートから請求への連鎖、SAR の来歴情報、類型ナレッジベース、学習済み手順 | /explorer |
| 3D 解説 | three.js ステージ上で 8 つのシーンをスクロールして閲覧できます:6 つの銀行スライスとグラフごとの ACL、コンソーシアムをつなぐハッシュ化 ID、アラートを解決する algo.wcc、1 つの銀行から 37.5% が見えるリング、PageRank ハブと algo.SPpaths、4 つの起点に集約される 6 つのパス、KYC カスケード、ハードウェアキーで署名された Merkle ルート。すべての数値は API から取得され、各シーンには実行された Cypher が表示されます | /explainer |
| ホスト型 MCP | claude mcp add --transport http bankweave https://bankweave-api.onrender.com/mcp:17 個の読み取り専用ツール(ケース、エコープルーフ請求、資金経路、リング、ハブ、連結成分、ベクトル検索と音声類似検索、トリアージ、類型、ガード付き Cypher)、3 つのプロンプト、2 つのリソース | /mcp、docs/MCP.md |
| ランディングページ | 光沢のある青いバブルを背景に、単語ごとに文字が表示される中央揃えのヒーロー、そこからせり上がるライブコンソール、「新機能」を紹介する弁当型レイアウト、ライブページのスクリーンショットをハイライト表示した評価、実際のツールの録画、FalkorDB Browser による実証 | / |
| 実ツールの録画 | Wokwi で動作する ESP32 スケッチが実際のカードタップをライブ API に送信し、EMVLab が出力された field 55 をデコードします | Hardware Lab、以下 |
| ランディングページ | ダッシュボード |
|---|---|
![]() | ![]() |
| グラフエクスプローラー:コンソーシアムグラフ上の銀行横断リング | 3D 解説:1 つの銀行から見たリング |
|---|---|
![]() | ![]() |
グラフエクスプローラー:algo.pageRank ハブ(ホバーすると 1 つのコミュニティにフォーカス) | 3D 解説:6 つの銀行スライス。それぞれが自分のグラフだけを表示 |
|---|---|
![]() | ![]() |
| アラートキュー | ケースワークスペース |
|---|---|
![]() | ![]() |
| 承認 | Hardware Lab |
|---|---|
![]() | ![]() |
公式 FalkorDB Browser での証明
エージェントが使用するものと同じデータを、FalkorDB 独自のブラウザーで開いています(browser.falkordb.com、FalkorDB Cloud インスタンスに接続:FalkorDB v4.22、36 グラフ、約 81 MB)。以下のクエリはすべて読み取り専用で、ブラウザーに入力したものです。実行時間はエンジン独自の RT 表示です。インスタンスのホスト名が表示された接続バーはトリミングしています。

| クエリ | 実証する内容 |
|---|---|
| 銀行横断リング:最も多くの銀行にまたがるケース、その口座、銀行、送金(12 ノード、166 エッジ、1.85 ms) | どの単一の銀行グラフにも含まれないリング全体を、1 つの Cypher クエリで確認できます |
CALL algo.pageRank('Account','TRANSFERS') の上位 12 件(3.55 ms) | Investigator が呼び出すハブ検出は Python ではなく、ネイティブの GraphBLAS です |
(:Account)-[:CARD_TXN]->(:Terminal)(5 ノード、29 エッジ、0.41 ms) | Wokwi ESP32 から送信されたものも含め、POS/ATM の取引記録がコンソーシアムグラフ内の実際のエッジであることを示します。Terminal ノードには POS-MUM-…、Mumbai、GPS 19.076、72.8777 が格納されています |
case_C-70431130 内の (:SAR)-[:CONTAINS]->(:Sentence)-[:CITES]->(:Claim)-[:SUPPORTED_BY]->(:Evidence)(0.61 ms) | すべての報告書の文がクレームを引用し、すべてのクレームが証拠に基づいていることを示します。来歴の検証はグラフパターンです |
db.idx.vector.queryNodes('Account','behavior_vec',10, …)(0.36 ms) | HNSW ベクトル検索により、5 つの異なる銀行にある行動が類似した口座を検出します |
異なる銀行にあり、同じ Device または IP を共有する口座(291 ノード、220 エッジ、2.79 ms) | コンソーシアムが銀行ごとのデータを結合する際に使用する識別情報のリンクです |
| 銀行横断リング | algo.pageRank |
|---|---|
![]() | ![]() |
| ターミナルへのカード取引(Wokwi からの取引を含む) | Mumbai の POS ノードとそのプロパティ |
|---|---|
![]() | ![]() |
| SAR → 文 → クレーム → 証拠 | HNSW ベクトル KNN |
|---|---|
![]() | ![]() |
| 銀行間で共有されているデバイスと IP | FalkorDB Cloud コンソール:インスタンス(Free tier、ap-south-1、v4.22.0、正常) |
|---|---|
![]() | ![]() |
ホスト型 MCP をライブで呼び出し(インストール不要、プレーン HTTP):
$ curl -s -X POST https://bankweave-api.onrender.com/mcp -H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'
17 tools: engine_overview, list_graphs, graph_schema, list_cases, get_case, explain_claim,
account_network, trace_money_path, find_rings, top_hubs, connected_components, similar_accounts,
search_customers, list_alerts, triage_alert, typology_guidance, run_readonly_cypher
$ ... "method":"tools/call","params":{"name":"top_hubs","arguments":{}}
{"graph": "consortium", "result": [{"account": "e8ccd1faa8d3a4ba", "bank": "001", "score": 0.0027...}, ...
最上位の口座は、上記の FalkorDB Browser に表示された PageRank クエリの 1 行目と一致します。
2.0 の新機能
| 領域 | できること | 場所 |
|---|---|---|
| コマンドセンター | ライブアラート、オープン中のケース、独立して裏付けられた請求、レビュー待ちの証拠、FalkorDB の健全性(メモリ、グラフ、エンジン)を 1 つのビューで確認できます | / |
| ゴールデンシナリオ | A:algo.wcc によって解除される無害なアラート。B:4 行にまたがる不正ネットワーク(単一の銀行が保有する割合は最大でも 50%、E2:平均 43.8%、ネットワーク全体を単独で保有する銀行は 0%)。C:請求の裏にある共有の 200 ユニットの建物と、KYC の更新が引き起こす連鎖。ライブで計算されます。無料プランの API がスリープ中の場合は、同梱のスナップショットが即座に読み込まれます | /scenarios |
| モードバッジ | 各ページで、LLM エージェントによるライブ実行、決定論的エージェントによるライブ実行、シード済みリプレイのいずれであるかを表示します | サイドバー、ページヘッダー |
| FalkorDB ラボ | 件数、インデックス、GRAPH.MEMORY USAGE を含むすべてのグラフ、ワンクリックで実行できる 17 種類の処理(10 種類のアルゴリズム、音声表記および語幹処理による全文検索、ベクトル KNN、JS UDF、FLEX、3 モダリティのクエリ)、読み取り専用の GRAPH.PROFILE/GRAPH.EXPLAIN インスペクター、スキーマ、ライブペイロード、各ツールが実行した Cypher とその Engine X-Ray を表示する MCP ツールエクスプローラー、銀行ごとの ACL、グラフとしての手続き記憶 | /lab |
| ケースワークスペース | 証拠独立性エクスプローラー(「15 の経路 → 12 の出所」)、任意の証拠を無効化して連鎖を確認、来歴 DAG(React Flow)、調査のリプレイ、二時点タイムマシン、GRAPH.COPY サンドボックスでの凍結シミュレーション、制裁対象のスクリーニング、暗号資産のオフランプの紐付け、エージェントのトレースウォーターフォール | /cases/<id> |
| 署名付きエクスポート | FinCEN 形式の SAR XML と印刷可能な監査ドシエ:すべての文、その根拠となる証拠、実行ハッシュ付きの各クエリ、およびケース全体を対象にした Ed25519 署名付き Merkle ルート | /cases/<id>/dossier |
| 3D コンソーシアム | 外部スタブで区切られた銀行スライス、それらが接続するコンソーシアム(フローパーティクル、PageRank ハブ)、その上に重ねて表示されるケースと請求。フライスルー、エコーの折りたたみ、無効化ショックウェーブ、ハートビートのカウントダウン付き停止・再開 | /consortium-3d |
| 評価 | E2 のヒーロー表示、しきい値エクスプローラー付きの E1 テーブル、E6 スコアカード、未検出項目を明示した E3~E5、ローカルベンチマークとしてバッジを付けた E7 | /evaluation |
| ハードウェアラボ(デバイスツイン、実際の暗号処理) | ISO 8583 と実際の EMV TLV をグラフに出力する POS/ATM デジタルツイン、Wokwi ESP32 端末、Merkle ルートを対象に WebAuthn または仮想セキュリティキーで署名される承認(後から証拠が変わると「Merkle seal broken」と表示)、改ざんされると自らを隔離する PCR アテステーション付きエンクレーブ、銀行間の ECDH-PSI | /hardware-lab、hardware/wokwi/ |
| インテグレーション | OpenSanctions によるスクリーニング(API キーがあればライブ実行、なければ同梱のサンプルリストを使用)、オンチェーンのウォレット情報、OTLP エクスポート対応の OpenTelemetry 形式スパン | /integrations/*、ケースのタブ |
カード端末、エンクレーブ、セキュリティキーはソフトウェアのデバイスツイン(Wokwi 上の ESP32 端末)として動作し、実際の EMV/ISO 8583 データ、実際の署名、実際の鍵交換、実際のグラフ書き込みを生成します。これらはすべて、物理デバイスが呼び出すものと同じ API を通じて行われます。
ライブサイトのスクリーンショット
https://bankweave.vercel.app で、Render API と FalkorDB Cloud(ap-south-1)を使用し、Groq の無料プランのエージェントで撮影したものです。モードバッジには「Live · LLM + FalkorDB」と表示されます。
| ゴールデンシナリオ:algo.wcc がクリアした A、銀行間にまたがるリングの B、カスケードの C | 銀行とコンソーシアム:1 行の銀行の断片とコンソーシアムの比較 |
|---|---|
![]() | ![]() |
| ケース | ケースワークスペース:証拠の独立性(「15 パス → 14 の起点」) |
|---|---|
![]() | ![]() |
| 来歴 DAG | GRAPH.COPY サンドボックスで凍結をシミュレーション |
|---|---|
![]() | ![]() |
| エージェントのトレースウォーターフォール(ライブエージェントからの OpenTelemetry 形式のスパン) | 制裁スクリーニングと暗号資産のオフランプブリッジ |
|---|---|
![]() | ![]() |
| SAR:すべての文で証拠を引用 | 署名済み Merkle ルート付き監査資料 |
|---|---|
![]() | ![]() |
| 信頼レイヤー:エコープルーフの信頼度とカスケード | 3D コンソーシアム |
|---|---|
![]() | ![]() |
| FalkorDB ラボ:グラフ、ノード、エッジ、メモリ | アルゴリズムとインデックスをワンクリックで実行 |
|---|---|
![]() | ![]() |
GRAPH.PROFILE / GRAPH.EXPLAIN インスペクター | ライブペイロードと実行した Cypher を表示する MCP ツール |
|---|---|
![]() | ![]() |
| エンジン機能:JS UDF、トライモーダルクエリ、銀行ごとの ACL | 評価 |
|---|---|
![]() | ![]() |
根拠を示した測定結果です。 ランディングページの「売り込みではなく、数値で」には、ライブ評価ページの以下のキャプチャが表示されています。
| E2:単一銀行で最良の検出率は 43.8%、リングを全体として検出した件数は 36 件中 0 件、コンソーシアムでは 100% | E1:調整済みグラフスコアの F1 は 0.205、すべてをエスカレーションした場合は 0.063 |
|---|---|
![]() | ![]() |
| E6:エコーの 27.8%を検出、SAR 28 件中 25 件がゲートを通過、カスケード再現率は 100% | E7:ベクトル KNN は 0.4 ms、コンソーシアム全体の PageRank は 57.5 ms |
|---|---|
![]() | ![]() |
ハードウェア信頼レイヤー(デバイスツイン、本物の暗号技術)
銀行はソフトウェアだけで処理を実行させません。端末がデバイスの証拠を生成し、HSM とエンクレーブが ID のハッシュ化を保護し、人間がセキュリティキーで承認します。BankWeave はこの3つをソフトウェア上のデバイスツインとして実行し、それぞれを FalkorDB に接続します。
実際のツールで記録。 hardware/wokwi/ の回路図を Wokwi ESP32 シミュレーターで実行します。Wokwi-GUEST に接続し、Mumbai POS で Card A をタップすると、ボードが HTTPS 経由で稼働中の API に送信します。API は 00 APPROVED を返し、CARD_TXN エッジを FalkorDB Cloud に書き込み、シリアルモニターに出力される ISO 8583 フィールド 55 を返します。その後、EMVLab.org がその TLV(取引金額、通貨、IFD シリアル D0006301、ATC、暗号文、PAN)をデコードします。
| Wokwi ESP32 → 稼働中の API → FalkorDB | EMVLab がタップのフィールド 55 をデコード |
|---|---|
![]() | ![]() |
稼働中のサイトにある Hardware Lab:
| 端末:POS と ATM のツイン、それぞれの直近のタップ、EMV TLV、EMVLab での検証 | セキュリティキー:WebAuthn または仮想 VaultKey でケースの Merkle ルートに署名 |
|---|---|
![]() | ![]() |
| エンクレーブ:アテステーション文書、PCR、HSM 署名者、銀行リンク | Wokwi 上の ESP32:実際のスケッチ、図、ライブシリアルログ |
|---|---|
![]() | ![]() |
| 2つの銀行グラフ間の ECDH-PSI(X25519) | FalkorDB Cloud のエッジとして記録された Wokwi のタップ(FalkorDB Browser) |
|---|---|
![]() | ![]() |
各デバイスツインが生成するもの:
| 部品 | 実際の出力 | 実行環境 |
|---|---|---|
| カード端末 | BER-TLV エンコード(EMVLab で検証)、ISO 8583 フィールドレイアウト、グラフへの書き込み(CARD_TXN、USES_DEVICE {emv_atc, terminal_id, gps, nfc_uid})、エージェントがトリアージするアラート、移動不可能な移動および ATC リプレイの検出 | 端末とカード。9F26 は HMAC であり、チップの 3DES/AES MAC ではありません |
| Wokwi ESP32 | 回路が Wokwi で実行され、実際の HTTPS リクエストを送信します | Wokwi シミュレーター内の ESP32 ボード |
| 承認キー | WebAuthn ES256 検証、署名カウンター、クレーム/証拠/文の Merkle ルート、失効時のシール破損 | VaultKey はタブ内の WebCrypto キーです |
| エンクレーブ/HSM | HMAC-SHA256 によるブラインディング、SHA-384 PCR、ES384 署名付き Nitro 方式の文書、(:EnclaveAttestation) ノード、隔離中は 423 で取り込みを拒否 | TEE ハードウェアも AWS Nitro PKI チェーンもありません |
| PSI | X25519 スカラー乗算、可換ブラインディング | 両方の銀行が1つのプロセス内で実行 |
外部検証ツール:EMVLab TLV デコーダー · EMVLab 暗号文ツール · WebAuthn.me デバッガー · Chrome 仮想認証器 · Wokwi ESP32 · OpenSanctions · FalkorDB Cloud.
FalkorDBが不可欠な理由
FalkorDBを停止すると、BankWeaveは中核となる処理を一切実行できません。
| グラフがない場合… | 理由 |
|---|---|
| リングが見えない | リングは銀行間の経路としてのみ存在し、コンソーシアムグラフ内で接続されるためです(E2を参照) |
| トリアージで何も解決できない | コンポーネント、モチーフスコア、銀行間リンク、共有IDはすべてグラフクエリだからです |
| どの主張にも根拠がない | 根拠は、グラフ内の経路、アルゴリズムスコア、または共有属性であり、そのクエリとともに保存されるためです |
| 信頼度を計算できない | エコー耐性のある信頼度は、SUPPORTED_BY エッジをたどって異なる origin の数を数えるためです |
| 無効化を連鎖できない | 依存関係が型付きエッジ(SUPPORTED_BY、DERIVED_FROM、JUSTIFIED_BY、CITES)だからです |
| エージェントが連携や再開をできない | タスク、ハートビート、ケースのタイムラインがグラフ内にあるためです |
使用中のFalkorDB機能:マルチグラフ(1つのインスタンス内に銀行別、コンソーシアム別、ケース別、手順、類型ナレッジベースのグラフを配置)、ネイティブアルゴリズム(algo.wcc、algo.labelPropagation、
algo.pageRank、algo.betweenness、algo.HarmonicCentrality、algo.SPpaths、algo.SSpaths、
algo.maxFlow、algo.bfs、algo.MSF)、Double Metaphoneの音声マッチングと英語のステミングを備えた全文検索インデックス、
行動プロファイル用のベクトルインデックス(HNSW)、JavaScript UDF(FalkorDBのFLEXライブラリと独自のaml_temporal)、GRAPH.COPYサンドボックス、
GRAPH.PROFILE/GRAPH.EXPLAIN、GRAPH.MEMORY USAGE、グラフ単位のACL、ライブpub/sub用のRedisプロトコル。
証明:BankWeaveが使用するFalkorDBの全機能
| 機能 | コード内の場所 | 動作の証拠 |
|---|---|---|
| マルチグラフ(1つのインスタンス内で分離されたグラフ) | consortium、bank_<id>、case_<id>、procedures、typology_kb(backend/app/db.py) | 実行中、ブラウザーに43~188個のグラフが表示されます。FalkorDB Cloud には consortium、6つの銀行グラフ、typology_kb が保持されています |
algo.wcc | コンポーネントのサイズを事前計算し、孤立ノード群をトリアージします(detection/precompute.py、detection/algorithms.py) | E7の実行時間。アラートキューのトリアージ理由「孤立クラスター」 |
algo.labelPropagation | コミュニティ(detection/precompute.py) | すべてのアカウントに Account.community が設定されています |
algo.pageRank | ケースグラフでのハブ検出、SPNSAの仲介者 | FalkorDB Cloud 上の (3.55 ms)。E7の実行時間 |
algo.betweenness(シード指定) | マネーミュールをつなぐ橋渡し、SPNSA | ![]() |
algo.HarmonicCentrality | オーケストレーター候補 | find_orchestrator ツール、反論ラウンド |
algo.SPpaths | 資金の経路:申し立てを裏付ける主な証拠 | すべてのケースで、クエリとともに path の証拠を提示します |
algo.SSpaths、algo.bfs | reach、bfs_reach ツール(ケースグラフ) | Investigator から、また MCP 経由で利用できます |
algo.maxFlow | 集約された FLOWS エッジ上のリスク対象資金 | ハブに関する申し立てでは、最大フローの証拠を引用します |
algo.MSF | backbone ツール:リングのスパニングバックボーン | Investigator、Reporter から、また MCP 経由で利用できます |
| 全文検索インデックス+Double Metaphone | Person.name、Company.name(detection/identity.py) | test_identity.py:スペルの異なる名前から元の本人を特定できます |
| 全文検索インデックス+英語のステミング | タイポロジーのナレッジグラフ(knowledge/typology_kb.py) | 回答に出典を付与し、無関係な質問には回答を控えます |
| ベクトルインデックス(HNSW、コサイン類似度) | 16次元の行動プロファイル(app/services/loader.py) | behavior_neighbors、トリアージ機能、手掛かりの拡張 |
| リレーションシップのプロパティインデックスを含む範囲インデックス | TRANSFERS.ts(txn_id エッジインデックスは2.0で削除されました。参照されず、約8 MBの容量を使用していたためです) | CALL db.indexes() |
JavaScript UDF(GRAPH.UDF LOAD) | aml_temporal.timeRespectingReach は getNeighbors で TRANSFERS を走査し、後続の送金のみをたどります(backend/udf/aml_temporal.js) | test_lab.py::test_udf_libraries_load_and_run。Lab → Engine の機能 |
| FLEX(FalkorDB の UDF ライブラリ、同梱バージョン1.0.1) | 名前用の flex.text.jaroWinkler、flex.text.levenshtein、共有される本人特定属性用の flex.sim.jaccard | Lab で flex_names、flex_jaccard を実行します |
GRAPH.COPY | Freeze のシミュレーションではケースグラフをコピーし、コピー内のアカウントを削除して、algo.maxFlow と algo.wcc を再実行します(app/routers/workspace.py) | test_workspace.py:フローが80から0に変化し、サンドボックスが削除されます |
GRAPH.PROFILE / GRAPH.EXPLAIN | 読み取り専用インスペクターと、ツール呼び出しごとの Engine X-Ray。クエリは事前に GRAPH.RO_QUERY を通過する必要があります(app/services/engine.py) | test_lab.py::test_inspect_refuses_writes |
GRAPH.MEMORY USAGE | Lab と Command Center でのグラフごとのメモリー使用量。100 MB のクラウド階層向け容量ガード(app/services/capacity.py) | /lab/graphs |
ACL(~graph キーパターン、ACL LOG) | 自分のグラフに対する GRAPH.RO_QUERY のみが許可された銀行ユーザー(/lab/acl-demo) | consortium、他の銀行、書き込みは拒否され、ログに記録されます(上のスクリーンショット)。FalkorDB Cloud ユーザーには ACL を管理する権限がないため、これは Docker 上で実行されます |
1つのクエリ内での複数の CALL | 3モードクエリ:音声学的な全文検索 → HNSW によるベクトルの類似候補 → FLOWS 上の algo.SPpaths | Lab の trimodal(約10 ms) |
パラメーター化 Cypher、読み取りには ro_query | すべてのクエリ(docs/QUERIES.md:登録済み204件+インライン67件) | 読み取り専用 MCP ツール cypher_readonly |
| 1つのグラフ上での並行書き込み | タスク用黒板(agents/blackboard.py) | test_blackboard.py:6スレッド、20タスク。それぞれが一度だけ取得されます |
| FalkorDB Browser | すべてのグラフの目視確認 | 以下のスクリーンショット |
| FalkorDB Cloud | IBM スライスをシードした稼働中のインスタンス(ap-south-1) | scripts/make_slice.py +シードログ |
ライブの FalkorDB Cloud インスタンスでの証拠
ライブサイトが使用する本番インスタンスに接続した FalkorDB Browser のスクリーンショット
(docs/img/cloud/):
| 内容 | スクリーンショット |
|---|---|
| マルチグラフ:1つのインスタンス内にコンソーシアム、6つの銀行グラフ、ケースグラフ | ![]() |
| 使用中のインデックスタイプ:ベクトルインデックス1つ(HNSW)、全文検索インデックス2つ(音声表記)、範囲インデックス14個 | ![]() |
| ラベルとプロパティ別のすべてのインデックス | ![]() |
コンソーシアム上の algo.pageRank(4.3 ms) | ![]() |
| 行動プロファイルに対するベクトル類似度検索(0.5 ms) | ![]() |
| Double Metaphone による全文検索:「Hana Sharma」で「Hannah Sharma」を検索 | ![]() |
| ライブエージェントが開いたリング:1つのハブが4つの銀行の口座に支払い(コンソーシアムグラフ、0.98 ms) | ![]() |
そのケース専用のグラフ:請求、SUPPORTED_BY と Skeptic の CHALLENGED_BY の証拠。SAR、Sentence、Event、Action もここにあります | ![]() |
IBM データを使用したローカル実行の証拠
| FalkorDB Browser のコンソーシアムリング | ケースグラフ:請求とその証拠 |
|---|---|
![]() | ![]() |
| ライブサイトの銀行とコンソーシアムの比較 | ゴールデンシナリオ B:ある銀行が37.5%を保有するリング |
|---|---|
![]() | ![]() |
| 実際の IBM データのアラートキュー | ケースワークスペース |
|---|---|
![]() | ![]() |
アーキテクチャ

flowchart TB
UI[Next.js UI: queue, network weave, case workspace, SAR, trust, approvals, scoreboard] -- REST / WebSocket --> API
API[FastAPI + WebSocket bridge] --> W
subgraph W[Agent worker: LangGraph flow]
O[Orchestrator] --> T[Triage] --> I[Investigator] <--> S[Skeptic] --> R[Reporter] --> A[Auditor]
H[Human approval] --> AR[Archivist]
end
W -- tools --> TOOLS[Tool registry]
MCP[MCP server: 34 tools] --> TOOLS
TOOLS -- Cypher / algo.* --> F[(FalkorDB: consortium, bank_*, case_*, procedures, typology_kb)]
TOOLS -- SQL --> PG[(Postgres KYC)]
W -- events --> RD[(Redis pub/sub)] --> API
W -- LiteLLM --> LLM[Groq free tier: writer qwen3.8-27b + different, larger auditor gpt-oss-120b]
LLM が計画を立て、ツールを選択し、文章を作成します。計算を行うのは Cypher と algo.* です。
API キーがない場合、エージェントは決定論的なポリシー(UI にその旨を表示)で実行されるため、システムは常に実行可能です。
グラフモデル

完全なスキーマは docs/GRAPH_MODEL.md を参照してください。概要は次のとおりです。
consortium:Account(ハッシュ化 ID、銀行、次数、PageRank、コンポーネント、コミュニティ、モチーフスコア、パススルー統計、16次元の行動ベクトル)-[:TRANSFERS]->Account、アカウントペアごとに集約された-[:FLOWS]->エッジ、ID レイヤー(Person/Company-[:OWNS]->;USES_DEVICE、USES_IP、REGISTERED_AT)、Alert、Decision、ブラックボードのTask、ケースミラー。bank_<id>:銀行独自のAccountとExternalAccountスタブ。銀行に関係する送金のみを含みます。case_<id>:Claim -[:SUPPORTED_BY|CHALLENGED_BY]-> Evidence {origin, cypher}、Claim -[:DERIVED_FROM]-> Claim、Action -[:JUSTIFIED_BY]-> Claim、SAR -[:CONTAINS]-> Sentence -[:CITES]-> Evidence|Claim、Evidence -[:SUPERSEDES]-> Evidence、Case -[:HAD_EVENT]-> Event -[:NEXT]-> Event。
Cypher クエリとアルゴリズム
製品が実行するすべてのクエリは、コードから生成された docs/QUERIES.md に記載されています。製品の中核を担うものをいくつか紹介します。
// echo-proof confidence: count independent origins, not paths
MATCH (c:Claim {id:$id})-[:SUPPORTED_BY]->(e:Evidence)
WHERE e.state IN ['active', 'needs_verification']
RETURN count(e) AS paths, count(DISTINCT e.origin) AS independent_sources
// money path between two accounts: the primary evidence for a claim
MATCH (s:Account {id:$src}), (d:Account {id:$dst})
CALL algo.SPpaths({sourceNode:s, targetNode:d, relTypes:['TRANSFERS'],
maxLen:$max_len, pathCount:$path_count, relDirection:$direction})
YIELD path, pathWeight
RETURN [n IN nodes(path) | n.id] AS accounts, [t IN relationships(path) | t.txn_id] AS txn_ids
// money at risk: max flow from flagged accounts to the hub (collapsed FLOWS edges)
CALL algo.maxFlow({sourceNodes:srcs, targetNodes:tgts, relationshipTypes:['FLOWS'],
capacityProperty:'capacity', nodeLabels:['Account']})
YIELD maxFlow, edges, edgeFlows
// premise check: does this action rest on overturned evidence?
MATCH (a:Action {id:$id})-[:JUSTIFIED_BY]->(c:Claim)
OPTIONAL MATCH (c)-[:SUPPORTED_BY|DERIVED_FROM*1..5]->(e:Evidence {state:'superseded'})
RETURN c.id, collect(e.id) AS stale
FalkorDB に標準搭載されていない機能は、プレーンな Cypher で実装しています(その旨も明記しています):次数(事前計算)、時間順のサイクル(時間を考慮した反復展開。ホップごとに1つのクエリ)、3サイクル(モチーフスコア)、固有ベクトル中心性(SPNSA では代わりに PageRank を使用)。
エージェントと MCP ツール

| エージェント | 内容 |
|---|---|
| Orchestrator | 未処理のアラートをブラックボードのタスクに変換し、期限切れの要求をリセットします |
| Triage | 理由を付けてアラートをクリアするか、ケースグラフを作成します |
| Investigator | グラフツールを選択する(LLM)か、学習済みの手順に従います。証拠に紐づく主張を書き、名称付きの類型を引用します |
| Skeptic | KYC の事実と属性共有のコンテキストを用いて、無実とする説明を論じます。ラウンドは最大 2 回です |
| Reporter + Auditor | 来歴ゲートを通して SAR を作成し、別のより高性能なモデルが監査します |
| Archivist | 有効だったツールの順序を保存し(手続き記憶)、ケースを終了します |
ホスト型 MCP(読み取り専用、インストール不要): claude mcp add --transport http bankweave https://bankweave-api.onrender.com/mcp。
同じ Render API から Streamable HTTP を介して 17 個の読み取り専用ツールを提供します。各ツールは
GRAPH.RO_QUERY を通じて実行され、グラフ、Cypher、パラメーター、時刻を返します。Claude Desktop
と Cursor のインストール手順、ツール一覧、実際のトランスクリプトは docs/MCP.md にあります。
完全なローカル MCP サーバー(python -m mcp_server.server、stdio または --http PORT)は、
trace_flow、find_hub、find_bridges、money_at_risk、typology_patterns、
passthrough_check、clue_expand、hunt_regions、resolve_entity、behavior_neighbors、
kyc_lookup、kb_query、echo_check、invalidate_evidence、premise_check、
さらに cypher_readonly と list_graphs を含む、すべての 34 個のツール(32 個のエージェントツールと cypher_readonly および list_graphs)を公開します。すべての結果には、実行した Cypher が含まれます。
Claude Desktop の設定:
{ "mcpServers": { "bankweave": {
"command": "/path/to/BankWeave/backend/.venv/bin/python",
"args": ["-m", "mcp_server.server"], "cwd": "/path/to/BankWeave/backend" } } }
信頼レイヤー

| 機能 | 防止する障害 | 出典 |
|---|---|---|
| エコー耐性のある信頼度 | 多数の経路が同じ事実にたどり着くために、その事実を何度も数えてしまうこと | GraphEcho、arXiv 2609.17695 |
| 連鎖的な無効化と前提チェック | 証拠が覆された信念に基づいて行動すること | PACMI、arXiv 2610.05732 |
| 来歴ゲートと相違レポート | 流暢なレポートが、証拠では裏付けられていない合意を捏造すること | Active Provenance Gate、arXiv 2609.31422 |
- 各
Evidenceはorigin(例:attr:D00063、flow:a->b、typ:cycle:a)を持ちます。 信頼度は異なる origin に基づいて計算されます。200 戸が共有する建物の住所は重みを下げます。 UI には「N 個の経路、K 個の独立した情報源」と、単純な方法で算出した数値が併記されます。 - 証拠を新しい証拠で置き換えても、古い証拠は削除されません。依存する項目は有効性の段階
(
active < needs_verification < historical_only < superseded)に沿って移行します。古い 証拠に基づく行動を承認するには、明示的な上書きメモが必要です。 - SAR は確定済みの一式から作成されます。まずコードによるチェック(引用された ID が存在し、有効で、 ケースに属していること)を実行し、次に別のモデルが文ごとに含意を判定します。来歴の忠実度が 0.95 以上の場合に限り、最大 3 回の修正後に公開します。それ以外の場合は、Investigator と Skeptic の見解を並べて示す相違レポートを書き出します。推奨事項は、エコー耐性のある信頼度が 0.5 未満の主張に基づくことはできません。
記憶と連携(Track 02)
- 共有状態: ブラックボードは
Taskノードで構成されます。タスクの確保は 1 回のアトミックなクエリで行います(6 個の同時ワーカーで検証済み。各タスクは必ず 1 回だけ完了します)。 - 停止と再開: ワーカーはハートビートを送信します。期限切れの要求はリセットされ、どのワーカーもグラフから処理を継続できます。デモの操作画面には停止ボタンがあり、ケースページには「グラフから再開」があります。
- エピソード記憶: 各ケースの
Eventタイムライン(HAD_EVENT、NEXT)は UI で再生できます。 - 意味記憶: 有効性の状態と履歴を持つ主張および証拠(
beliefs_as_of)。 - 手続き記憶:
proceduresグラフには、承認された結果につながったツールの順序が保存されます。 - ケース横断の想起: 主張の要約がコンソーシアムにミラーリングされます(
Account <-[:ABOUT]- Claim)。 - 分離: 1 つの FalkorDB インスタンス内に、銀行ごとおよびケースごとのグラフを設けます。
評価

E1:アラートのトリアージ(IBM HI-Small、20 行のコンソーシアム)
期間の後半にアラートが出た4,000件の口座(不正口座129件、ベースレート3.2%)を対象とし、重みとしきい値は前半のデータのみから設定しました。
| 方法 | 適合率 | 再現率 | F1 | エスカレーションされた口座 | エスカレーションされなかったアラート |
|---|---|---|---|---|---|
| ルールベース:すべてをエスカレーション | 3.2% | 100.0% | 0.062 | 4,000 | 0.0% |
| グラフを使わないルール(3つ以上のルール) | 33.3% | 7.8% | 0.126 | 30 | 99.2% |
| BankWeave グラフスコア、手動設定の重み(ラベルなし) | 18.9% | 14.0% | 0.161 | 95 | 97.6% |
| BankWeave グラフスコア、開発用分割データで調整 | 17.8% | 24.0% | 0.205 | 174 | 95.7% |
eval/results/E1_alert_triage.json、コミット 49f9388、HI-Small_Trans.csv(20 行、グラフのプレフィックス 'ibm_')
E2:単独で資金洗浄ネットワーク全体を把握できる銀行はない
複数の銀行にまたがる36の資金洗浄グループ(1グループあたり平均3.5行)を対象にすると、最も多く把握している単一の銀行でも、ネットワーク内の口座の**43.8%しか保有しておらず、ネットワーク全体を把握できるケースは0.0%**です。資金洗浄送金の95.7%は観測できていますが、取引相手の多くは調査できない他行の顧客です。コンソーシアムのグラフでは、すべてのネットワークを100%把握できます。
eval/results/E2_consortium_vs_single_bank.json、コミット 49f9388、HI-Small_Trans.csv(20 行、グラフのプレフィックス 'ibm_')
E3:ハントモード(SPNSA の再現、k=200、r=1)
| シードフィード | サブグラフ内の口座数 | 不正口座の割合 | 論文(HI-Small) |
|---|---|---|---|
| ランダム(10回の平均) | 250 | 3.4% | 2.4% |
| 次数の不均衡 | 336 | 17.0% | 13.7% |
| モチーフ整合型(論文のパラメーター) | 280 | 7.5% | 22.6% |
| モチーフ、次数ペナルティなし(事後アブレーション) | 378 | 11.6% | — |
このグラフのベースレートは2.5%です。論文の順位付けは再現できませんでした。論文のパラメーターを使うと、20行のスライスでは次数ペナルティによってモチーフスコアの順位が逆転し(口座単位のAUCは、ペナルティありで0.3743、なしで0.638)、ここでは次数の不均衡が最良となりました。すべてのフィードがランダムを上回っています。
eval/results/E3_spnsa_hunt.json、コミット cc7037a、HI-Small_Trans.csv(20 行、グラフのプレフィックス 'ibm_')
E4:通過取引のマッチング
708件の口座にフラグが付き、そのうち4.8%が不正口座でした(ベースレートは2.5%)。チェーンの重複を除いた金額:74,961,854,871(IBM の金額は多くの通貨で記録されているため、これは米ドル換算額ではなく単純合計です)。
eval/results/E4_passthrough.json、コミット 154672b、HI-Small_Trans.csv(20 行、グラフのプレフィックス 'ibm_')
E5:手掛かりを用いた追跡
12の資金洗浄グループから手掛かりとなるメンバーを2件使った場合、最良の第2ラウンドで適合率33.3%、再現率3.4%に達します。これは低い値です。グラフシグナル版(GNN なし)では、主に手掛かりの直近の取引相手が見つかります。
eval/results/E5_clue_expansion.json、コミット 706ae01、HI-Small_Trans.csv(20 行、グラフのプレフィックス 'ibm_')
E6:エージェントの実案件における信頼レイヤー
ライブ IBM スライスから構築したエージェントの28件の案件を対象としました。
- **エコー:**510件の証拠項目のうち27.8%は、すでに確認された情報源を繰り返していました。101件の主張のうち37件は、独立した情報源ではなく、裏付ける経路の数が多いものでした。平均信頼度は、エコーを除いた場合が41.7%、経路を数えた場合が48.8%でした。
- **来歴ゲート:**28件の SAR のうち25件が公開され、3件は相違点の報告となりました。来歴忠実度の平均は0.988で、26件で少なくとも1回の修正ラウンドが必要でした。
- **連鎖的な無効化:**スクリプトで生成した依存関係グラフ50件で、影響を受けたノードの再現率と適合率はいずれも100.0%でした。
- **古い承認:**覆された証拠に基づき、上書きなしで承認されたアクションは0件でした。
eval/results/E6_trust_layer.json、コミット f3cff38、IBM_SLICE_Trans.csv(6 行、グラフのプレフィックス '')
E7:速度(1 台のローカルマシン)
コンソーシアムグラフ:28,307 アカウント、1,315,597 件の送金。
| 操作 | 中央値 | 95 パーセンタイル |
|---|---|---|
| 近傍を展開 | 3.1 ms | 6.1 ms |
| 類型パターン | 12.5 ms | 674.0 ms |
| 銀行間リンク | 0.6 ms | 0.9 ms |
| 共通 ID | 0.7 ms | 0.9 ms |
| 行動上の近傍 | 0.4 ms | 1.0 ms |
| 通過チェック | 2.8 ms | 10.5 ms |
| ハブアカウントのトリアージシグナル | 1.1 ms | 2.3 ms |
| 通常アカウントのトリアージシグナル | 15.4 ms | 58.0 ms |
| コンソーシアムのページランク | 57.5 ms | |
| コンソーシアムの WCC | 39.5 ms |
eval/results/E7_performance.json、コミット b8a1292、ibm_
デプロイ(稼働中)
| 構成要素 | 場所 | 方法 |
|---|---|---|
| グラフデータベース | FalkorDB Cloud、AWS ap-south-1 | scripts/make_slice.py + scripts/seed_all.sh でシード(実際の IBM スライス:24,990 件の取引、6 行) |
| API + エージェントワーカー | Render のウェブサービス bankweave-api(シンガポール) | ルートの Dockerfile。Render CLI で作成。エージェントは API プロセス内で実行 |
| ライブイベント | プロセス内イベントバス(単一サービスでは Redis 不要) | backend/app/events.py |
| KYC Postgres | Neon(aws-ap-southeast-1) | python -m app.services.kyc_synth --postgres-only |
| UI | Vercel bankweave.vercel.app | frontend/ から vercel deploy --prod |
| LLM | Groq の無料プラン(ライター qwen/qwen3.8-27b、監査役 openai/gpt-oss-120b)、フォールバックとして OpenRouter の無料モデル | backend/agents/llm.py |
Render の無料プランでは、15 分間アイドル状態が続くとスリープします。最初のリクエストで起動し(約 1 分)、エージェントはグラフのブラックボードから処理を再開します。GitHub Actions のジョブが 10 分ごとに /health に ping を送って起動状態を維持します。また、起動中も、取得済みの実際の API レスポンス(scripts/capture_snapshots.py)を画面上に表示するため、メインページは引き続き利用できます。
FalkorDB Cloud の無料プランは 100 MB で、noeviction が設定されています。2.0 以降、グラフはコンパクト形式で読み込まれます(KYC_ARGS=--compact、未使用の txn_id エッジインデックスなし、約 100 ノードのケースグラフに ID インデックスなし)。/health は使用メモリを報告し、scripts/cloud_reseed.sh はピン留めされたケースを保持しながらクラウドグラフを再構築します。古いケースグラフは、CAPACITY_PRUNE=true の場合に限り自動的に削除されます。
任意の環境変数:OPENSANCTIONS_API_KEY(稼働中の制裁スクリーニング)、HELIUS_API_KEY(Solana ウォレットの検索)、EVM_RPC_URL、OTEL_EXPORTER_OTLP_ENDPOINT および OTEL_EXPORTER_OTLP_HEADERS(エージェントのスパンを Langfuse、Jaeger、または任意の OTLP コレクターにエクスポート)、DOSSIER_SIGNING_KEY(ドシエ署名用の hex Ed25519 シード)、PINNED_CASES、CAPACITY_PRUNE。
ローカルで実行する
ビルド済み API イメージ:docker pull ghcr.io/lsudoko/bankweave-api:latest(リリースごとに公開)。
docker compose up -d # FalkorDB (6390, Browser 3030), Redis (6391), Postgres (5440)
cp .env.example .env # add GROQ_API_KEY (free) for LLM agents (optional)
cd backend && uv sync && cd ..
scripts/seed_all.sh # sample dataset -> bank graphs, consortium, identity, precompute
cd backend && uv run python -m app.services.baseline && uv run uvicorn app.main:app --port 8000
cd frontend && pnpm install && pnpm dev -p 3001
http://localhost:3001 を開き、「Demo control」に移動して「Start agents」を押します(エージェントがアラートのトリアージとケースの作成を開始し、ダッシュボードがリアルタイムで更新されます)。
評価用 IBM データ:scripts/download_ibm.sh(Kaggle トークンを使用)または公開ミラー
hf.co/datasets/eexzzm/IBM-Transactions-for-Anti-Money-Laundering-HI-Small-Trans を使い、その後
GRAPH_PREFIX=ibm_ scripts/seed_all.sh data/raw/HI-Small_Trans.csv --top-n 20 および
GRAPH_PREFIX=ibm_ eval/run_all.sh を実行します。
テスト:cd backend && uv run pytest(ローカルの FalkorDB に対する 55 件のテスト)。
ハードウェア:hardware/wokwi/ の ESP32 端末は Wokwi で動作し、HTTPS 経由でカードのタップを POST /hardware/pos-tap に送信します(README を参照)。
データ
- IBM Transactions for Anti-Money Laundering(AMLworld、HI-Small)。標準的なラベル付きAMLベンチマークです。実際の銀行取引データは公開できないため、IBMがマルチエージェントのワールドモデルを使って生成しました。取引件数は5,078,345件、ラベル付きのマネーロンダリング送金は5,177件、マネーロンダリングの類型は8種類です。ラベルは
eval/でのみ使用します。稼働中のインスタンスでは、このデータの6銀行分(口座3,024件、送金24,990件)を使用します。 - IDレイヤー(
backend/app/services/kyc_synth.py、シード値42):人物、名前のバリエーション、デバイス、IPアドレス、住所、PostgresのKYCテーブルを生成します。漏えいの監査ができるよう、生成ルールも公開しています。マネーロンダリングの試行に関与するメンバーがデバイスを共有する確率は0.40、無関係な口座では0.03です。無関係な口座の6%は、家族で住所またはIPアドレスを共有します。200戸の建物(A-77)には、試行に関与するメンバーを含む約15の口座があります。 - ローカル環境向けサンプルデータセット(
data/demo、シード値42):無関係な取引を含むIBM形式の取引データと、IBMの8種類のパターンにまたがる16件の銀行間マネーロンダリングスキームです。 - AMLコンプライアンスの要件に従い、実在する人物の個人データは一切含まれていません。
AI ツールに関する開示
Claude Code(Anthropic)の支援を受けて開発しました。チームの指示のもと、コードの大部分をClaude Codeが作成しました。すべてのモジュールはチームがレビューし、内容を理解しています。実行時には、エージェントはGroq経由で無料枠のLLM(ライターはqwen/qwen3.8-27b、監査役はopenai/gpt-oss-120b。後者は別のベンダーが提供する、異なるより大規模なモデル)を使用し、フォールバックとしてOpenRouterの無料モデルを使用します。
適用範囲と設計上の注意点
- データはIBMのAMLworldベンチマークと、文書化されたIDレイヤーです。銀行独自のデータを接続するには、同じグラフモデルに読み込みます(
scripts/seed_all.shは任意のIBM形式のCSVを受け付けます)。 - IBMのPatternsファイルがない場合、マネーロンダリングの試行は、マネーロンダリング送金がつながったグループとして近似します(各結果ファイルにその旨を記載しています)。
- 手がかりに基づく復元では、論文のGNNではなくグラフシグナルを使用します。
- コンソーシアムIDはソルト付きハッシュです。ECDH-PSIハンドシェイクでは実際のX25519演算を行います。このデプロイでは両銀行の側を1つのサービス内で実行しますが、本番環境ではそれぞれの銀行で実行します。
- エンクレーブ、カード端末、VaultKeyは、ソフトウェア上のデバイスツイン(Wokwi上のESP32)として動作し、実際の暗号技術(HMAC、SHA-384 PCR、ECDSA P-384/P-256、Ed25519、X25519)を使用します。物理HSM、端末、キーも同じエンドポイントに接続できます。EMVアプリケーションクリプトグラム(9F26)はHMACです。
- SARエクスポートは確認用のFinCEN形式XMLであり、BSA E-Filingへの提出データではありません。
- 制裁対象者のスクリーニングでは、APIキーがある場合はOpenSanctionsのライブデータを使用し、ない場合は同梱のサンプルリストを使用します。名前のみの一致は、生年月日または国で確認します。
- Evaluationページのしきい値エクスプローラーは、モデルのトレーニングデータと重複するライブスライスで実行されるため、数値は楽観的です。ホールドアウトでの結果はE1の表を参照してください。
ライセンス
MIT。詳細はLICENSEを参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。
























































