mcpField
Z
ZettelForge

ZettelForge

ローカル
github.com/rolandpgセキュリティ6616 週間前に更新

ZettelForge について

ZettelForge は、サイバー脅威インテリジェンス(CTI)向けのエージェント型メモリシステムです。アナリストのメモや脅威レポートから CVE、脅威アクター、IOC、ATT&CK テクニックを抽出し、STIX 2.1 ナレッジグラフを構築します。プロセス内で動作し、外部 API キーは不要です。

主な機能

  1. 01CVE、脅威アクター、IOC、ATT&CK テクニックのエンティティ抽出
  2. 02APT28 と Fancy Bear などの脅威アクター別名解決
  3. 03因果トリプルを含む STIX 2.1 ナレッジグラフ
  4. 04ベクトル検索とグラフ探索を組み合わせた意図認識型検索
  5. 05Sigma・YARA ルールの解析、検証、取り込み
  6. 06OCSF スキーマの監査ログ

活用シーン

  1. 01SOC のアナリスト離任時に調査コンテキストを保存
  2. 02特定の脅威アクターに関する過去のレポートの検索
  3. 03Sigma・YARA ルールを同じオントロジーに関連付けたクエリ

MCP 対応

ZettelForge は MCP サーバーとして、zettelforge_remember や zettelforge_recall を含む 7 つのツールを公開し、Claude Code からメモリの保存と検索を可能にします。

設定

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

mcp.json · 共通設定
{
"mcpServers": {
"rolandpg-zettelforge": {
"command": "uvx",
"args": [
"zettelforge"
]
}
}
}
起動コマンドuvx zettelforge

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

パッケージ
pypizettelforge2.4.0

ツール

7

掲載時のツール一覧 · 2 週間前に更新

パラメーター型必須説明
domainstringいいえドメイン:cti、incident、general
evolvebooleanいいえメモリの進化を有効にします。LLM が既存のノートと比較し、ADD/UPDATE/DELETE/NOOP を判断します。処理は遅くなりますが、重複または古い知識を防げます。
sourcestringいいえソース参照
contentstringはい保存する脅威インテリジェンスのテキスト

詳細

ZettelForge

サイバー脅威インテリジェンスのために構築された、唯一のエージェント型メモリシステムです。

ベテランアナリストが退職すると、2、3年分の知見も一緒に失われます。顧客環境、過去の調査、攻撃者のTTP、誤検知のパターン、そして苦労して得た「待て、これを以前にも見たことがある」という気づきのすべてです。ZettelForgeは、そうした知見をチームに残すために構築されたエージェント型メモリシステムです。

アナリストのメモや脅威レポートからCVE、脅威アクター、IOC、ATT&CKのテクニックを抽出し、別名(APT28 = Fancy Bear = STRONTIUM = Sofacy)を解決して、STIX 2.1ナレッジグラフを構築します。そして、過去の調査をすべて自然言語でアナリストに、さらにMCP経由でClaude Codeに提供します。すべてプロセス内で実行されます。APIキーは不要です。クラウドも使用しません。データがホストの外に出ることはありません。

PyPI Downloads/month Star History Python 3.10+ License: MIT CI Open Issues Ask DeepWiki

Star · pip install zettelforge · ドキュメント · ThreatRecall(ホスト版) · 変更履歴

v2.6.2(2026-04-27):設定用ウェブエディターで、すべての列挙型フィールド(LLM/埋め込みプロバイダー、ログレベル、PIIの処理方法、合成形式)のドロップダウンが正しく動作するようになり、「適用」ボタンも動作するようになりました。新しい[crewai]追加機能により、ZettelForgeをCrewAIツールとして利用できます — pip install zettelforge[crewai]。変更履歴の全文

ZettelForgeのデモ — CTI向けエージェント型メモリの動作

ZettelForgeが実際に運用しているCTIワークフローに適しているなら、スターを付けることが、この分野への投資を続ける価値があると伝える最も手早い方法です。

課題

どの SOC でもアナリストは離職します。退職すると、調査の背景情報、攻撃者の特定情報、環境固有の誤検知パターンも一緒に失われます。後任者は同じチケットを再度開き、同じレポートを読み直し、同じメンタルモデルをゼロから構築し直します。

汎用 AI メモリーシステムでは、セキュリティチームのこの問題は解決できません。APT28 と Fancy Bear を区別できず、CVE-2024-3094 が XZ Utils のバックドアだと知らず、Sigma や YARA を解析できず、MITRE ATT&CK のテクニック ID も認識できません。CTI アナリストが1年分のインテリジェンスレポートを渡しても、返ってくるのはチャット履歴に対する曖昧なセマンティック検索です。

ZettelForge は、脅威グラフを用いて思考するアナリスト向けに開発されました。CVE、脅威アクター、IOC、ATT&CK テクニックを自動的に抽出し、命名規則をまたいで別名を解決し、因果関係を持つナレッジグラフを構築し、意図を認識したブレンド検索でメモリーを取得します。すべてプロセス内で実行され、外部 API に依存しません。

メモリー拡張により、CTI タスクにおける小規模モデルと大規模モデルの性能差が33%縮まります(大規模モデルのベースラインとして GPT-4 を使用、CTI-REALM、Microsoft 2026)。手法と比較については、ベンチマークレポート全文をご覧ください。

機能ZettelForgeMem0GraphitiCognee
CTI エンティティの抽出(CVE、アクター、IOC)はいいいえいいえいいえ
STIX 2.1 オントロジーはいいいえいいえいいえ
脅威アクターの別名解決はい(APT28 = Fancy Bear)いいえいいえいいえ
因果関係のトリプルを含むナレッジグラフはいいいえはいはい
意図分類による取得(5種類)はいいいえいいえいいえ
プロセス内で動作/外部 API 不要はいいいえいいえいいえ
OCSF スキーマの監査ログはいいいえいいえいいえ
MCP サーバー(Claude Code)はいいいえいいえいいえ

データパイプライン

ZettelForge のアーキテクチャ -- ニューラル想起ループ:取り込み、エンリッチ、取得、統合。SQLite + LanceDB を基盤とする

## 機能

エンティティ抽出 -- CVE、脅威アクター、IOC(IP、ドメイン、ハッシュ、URL、メールアドレス)、MITRE ATT&CK の手法、キャンペーン、侵入セット、ツール、人物、場所、組織を自動的に識別します。Regex と LLM による NER を使用し、全体を通じて STIX 2.1 の型を適用します。

ナレッジグラフ -- エンティティはノードになり、共起はエッジになります。LLM は因果関係のトリプル(「APT28 は Cobalt Strike を 使用する」など)を推論します。時間的なエッジと置き換え関係により、インテリジェンスの変化を追跡します。

エイリアス解決 -- APT28、Fancy Bear、Sofacy、STRONTIUM はすべて同じアクターノードに解決されます。保存時と呼び出し時に自動的に機能します。

ブレンド検索 -- ベクトル類似度(768 次元の fastembed、ONNX)とグラフ探索(ナレッジグラフのエッジをたどる BFS)を、インテント分類に基づいて重み付けします。インテントは事実、時間、関係、探索、因果の 5 種類です。

メモリの進化 -- evolve=True を指定すると、新しいインテリジェンスを既存のメモリと比較します。LLM が追加、更新、削除、または何もしないかを判断します。古くなったインテリジェンスは置き換えられ、矛盾は解決され、重複はスキップされます。

RAG による統合 -- direct_answer 形式を使用して、保存されているすべてのメモリから回答を統合します。

アーキテクチャ上、プロセス内で動作 -- 埋め込みには fastembed(ONNX)、任意のローカル LLM 推論には llama-cpp-python、ストレージには SQLite + LanceDB を使用し、デフォルトでは localhost 上の Ollama を利用します。外部 API キーは不要です。初回実行時に埋め込みモデルや LLM モデルをダウンロードするため、外部ネットワークにアクセスする場合があります。モデルを事前に読み込んだ後は、エアギャップ環境のホストを含め、完全にオフラインで実行できます。

OCSF スキーマでの監査ログ記録 -- すべての操作で、Open Cybersecurity Schema Framework 形式の構造化イベントが出力されます。ログストリームをどう扱うか(SIEM、WORM ストア、何もしない)は自由です。

クイックスタート

30 秒で始める Hello World(LLM 不要)
pip install zettelforge
from zettelforge import MemoryManager

mm = MemoryManager()

# Store CTI -- entities (CVEs, actors, ATT&CK IDs, IOCs) extracted via regex
mm.remember("APT28 uses Cobalt Strike for lateral movement via T1021")
mm.remember("APT28 (Fancy Bear) targets NATO defense contractors with spear-phishing")
mm.remember("CVE-2024-3094 is the XZ Utils backdoor (CVSS 10.0) affecting sshd")

# Recall blends vector + graph search; alias resolution kicks in (Fancy Bear -> APT28)
for note in mm.recall("What tools does Fancy Bear use?", k=3):
    print(f"[{note.metadata.tier}] {note.content.raw}")

外部サービスを使わず、新規の pip install 環境で動作します。埋め込みは fastembed を使ってプロセス内で実行されます(初回の呼び出し時に約 80 MB の ONNX モデルをダウンロードします)。MemoryManager() はデフォルトで ~/.amem/ に書き込みます。ZETTELFORGE_DATA_DIR または設定から変更できます。実行可能なサンプルは examples/quickstart.py にあります。

統合と高度な抽出のために LLM を追加する
ollama pull qwen3.5:9b && ollama serve
# With Ollama running, synthesize() returns a real summary across stored notes
answer = mm.synthesize("Summarize known APT28 TTPs")
print(answer["synthesis"]["answer"])
# Background LLM NER also enriches stored notes with additional entities

ZettelForge は Ollama を自動検出します。別のプロバイダー(local の llama-cpp、100 以上のプロバイダーに対応する litellm、テスト用の mock)を使用する場合は、設定を参照してください。LLM がなくても synthesize() は構造化されたレスポンスを返しますが、answer フィールドはフォールバックのプレースホルダーです。pip のみのモードで有用な結果を生成するのは remember と recall だけです。

メモリの進化
# New intel arrives -- evolve=True enables memory evolution:
# LLM extracts facts, compares to existing notes, decides ADD/UPDATE/DELETE/NOOP
mm.remember(
    "APT28 has shifted tactics. They dropped DROPBEAR and now exploit edge devices.",
    domain="cti",
    evolve=True,   # existing APT28 note gets superseded, not duplicated
)

仕組み

remember() を呼び出すたびに、次のパイプラインが実行されます。

  1. エンティティ抽出 -- Regex と LLM による NER で、CVE、侵入セット、脅威アクター、ツール、キャンペーン、ATT&CK の手法、IOC(IPv4、ドメイン、URL、MD5/SHA1/SHA256、メールアドレス)、人物、場所、組織、イベント、アクティビティ、時間的な参照(全 19 種類)を識別します
  2. ナレッジグラフの更新 -- エンティティはノードになり、共起はエッジになり、LLM が因果関係のトリプルを推論します
  3. ベクトル埋め込み -- 768 次元の fastembed(ONNX、プロセス内、埋め込みあたり 7 ミリ秒)を LanceDB に保存します
  4. 置き換えの確認 -- エンティティの重複を検出し、古くなったノートを置き換え済みとしてマークします
  5. デュアルストリーム書き込み -- 高速パスは約 45 ミリ秒で結果を返します。因果関係の補完処理はバックグラウンドワーカーに委ねられます

recall() を呼び出すたびに、2 つの検索戦略を組み合わせます。

  1. ベクトル類似度 -- 埋め込みを使ったセマンティック検索
  2. グラフ探索 -- ナレッジグラフのエッジをたどる BFS。ホップ距離に基づいてスコアを付けます
  3. インテントルーティング -- クエリを事実、時間、関係、因果、探索のいずれかに分類し、種類ごとに重みを調整します
  4. クロスエンコーダーによる再ランキング -- ms-marco-MiniLM が関連性に基づいて最終結果を並べ替えます

Claude Desktop で ZettelForge を 60 秒で使う

pip install zettelforge

プロジェクトのルートにある .claude.json(またはグローバルにアクセスする場合は ~/.claude/.claude.json)を作成または編集します。

{
  "mcpServers": {
    "zettelforge": {
      "command": "python3",
      "args": ["-m", "zettelforge.mcp"]
    }
  }
}

ZettelForge が仮想環境にインストールされている場合は、その Python インタープリターのフルパスを使用します。

{
  "mcpServers": {
    "zettelforge": {
      "command": "/home/user/.venvs/zettelforge/bin/python",
      "args": ["-m", "zettelforge.mcp"]
    }
  }
}

Claude Code を起動し、ツールが利用可能であることを確認します。

claude
# Inside the session, ask: "What tools do you have available from zettelforge?"

公開されるツールは 7 つです。zettelforge_remember、zettelforge_recall、zettelforge_synthesize、zettelforge_entity、zettelforge_graph、zettelforge_stats、および zettelforge_sync(エンタープライズパッケージが必要です)。スキーマ、JSON-RPC リクエスト/レスポンスの例、エラーコード、遅延シングルトンのライフサイクルについては、MCP プロトコルのリファレンスを参照してください。トラブルシューティング、仮想環境のパス、ツールの手動テストについては、MCP サーバーのセットアップを参照してください。

ベンチマーク

公開済みの学術ベンチマークを用いて評価しました。

ベンチマーク測定内容スコア
CTI Retrieval(CTIBench サブセット)帰属、CVE の関連付け、複数ホップ75.0%
RAGAS検索品質(キーワードの出現)78.1%
LOCOMO(ACL 2024)会話メモリの想起22.0%

スコア列には、Ollama ホストモデルを使用して実行した ZettelForge の測定結果を記載しています。ただし、LOCOMO の行のみ例外で、v2.1.1 において評価採点に Ollama クラウド判定モデルを使用して再測定しています(生成はローカルではありません)。ベンチマークごとの方法論、バージョン履歴、各スイートの判定モデル設定については、ベンチマークレポート全文を参照してください。

メモリとしての検出ルール(Sigma + YARA)

Sigma ルールと YARA ルールは、第一級のメモリプリミティブです。ルールを解析、検証、取り込むと、そのタグがグラフのエッジになります。MITRE ATT&CK のテクニック、CVE、脅威アクターの別名、ツール、マルウェアファミリーは、ほかのすべてのノートと同じオントロジーに照らして解決されます。共通の DetectionRule スーパータイプが SigmaRule と YaraRule のサブタイプを保持するため、単一のルール UUID を両方の形式で参照できます。

Sigma ルールは、同梱されている SigmaHQ JSON スキーマに対して検証されます。YARA ルールは plyara で解析され、CCCS YARA メタデータ標準(ティア:strict、warn、non_cccs)に照らしてチェックされます。取り込みは冪等です。変更のないルールを再取り込みすると、コンテンツハッシュ化された source_ref を介して元のノートが返されます。

from zettelforge import MemoryManager
from zettelforge.sigma import ingest_rule as ingest_sigma
from zettelforge.yara import ingest_rule as ingest_yara

mm = MemoryManager()
ingest_sigma("rules/proc_creation_win_office_macro.yml", mm)
ingest_yara("rules/webshell_china_chopper.yar", mm, tier="warn")
# Bulk ingest from SigmaHQ or a private rule repo
python -m zettelforge.sigma.ingest /path/to/sigma/rules/
python -m zettelforge.yara.ingest /path/to/yara/rules/ --tier warn

# CI fixture check -- parse + validate, no writes
python -m zettelforge.sigma.ingest rules/ --dry-run

LLM ルール解説機能(zettelforge.detection.explainer.explain)は、任意の DetectionRule に対して、意図、主要フィールド、回避に関する注記、誤検知の仮説を含む構造化 JSON サマリーを生成します。v1 ではオンデマンドで同期実行されます。非同期のエンリッチメントキューとの連携は v1.1 で対応予定です。ZETTELFORGE_EXPLAIN_RPM(デフォルトは 1 分あたり 60 回)によってレート制限されます。

参考資料:Sigma 仕様、SigmaHQ ルール、CCCS YARA、YARA ドキュメント。

インテグレーション

ATHF(エージェント型脅威ハンティングフレームワーク)

完了した ATHF のハント結果を ZettelForge のメモリに取り込みます。MITRE のテクニックと IOC が抽出され、ナレッジグラフ内でリンクされます。

python examples/athf_bridge.py /path/to/hunts/
# 12 hunt(s) parsed
# Ingested 12/12 hunts into ZettelForge

examples/athf_bridge.pyを参照してください。

ThreatRecall(ホステッド)

ThreatRecall は、エンタープライズ拡張機能を有効にした ZettelForge の商用版です。デフォルトではマネージド SaaS として提供され、機密環境向けにオンプレミスでのセルフホストやエアギャップ環境へのデプロイもオプションで選択できます。エンタープライズ向けアドオン:

  • TypeDB STIX 2.1 バックエンド -- 推論ルールを備えたスキーマ強制型オントロジー
  • OpenCTI 同期 -- お使いの OpenCTI インスタンスとの双方向同期
  • マルチテナント認証 -- テナントごとにデータを分離する OAuth/JWT
  • Sigma ルール生成 -- 抽出した IOC から検知ルールを生成(近日公開)

SaaS は、インフラストラクチャの保守なしで数分以内にデプロイできます。セルフホスト版は、外部ネットワークへの接続が制限または禁止されている環境向けに、デプロイ可能なバンドルとして提供されます。

ウェイトリストに登録 -- 現在、デザインパートナーの受け入れを進めています。

設定

変数デフォルト説明
AMEM_DATA_DIR~/.amemデータディレクトリ
ZETTELFORGE_BACKENDsqliteSQLite コミュニティバックエンド。拡張機能から TypeDB を利用できます。
ZETTELFORGE_LLM_PROVIDERlocallocal(llama-cpp)または ollama

すべてのオプションについては、config.default.yaml を参照してください。

コントリビューション

開発環境のセットアップについては、CONTRIBUTING.md を参照してください。

ライセンス

MIT -- LICENSE を参照してください。

Patrick Roland が開発 -- LinkedIn | Summit 7 Systems SOC サービス担当ディレクター | 海軍原子力部門の退役軍人 | CISSP、CCP(CMMC 2.0 Professional)

プロジェクトを支援する

ZettelForge は MIT ライセンスです。リポジトリにスターを付け、イシューを作成し、PR を送信してください。あらゆるコントリビューションを歓迎します。

謝辞

コメント

MCP は初めてですか?

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

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