Keel について
Keelは、製品内の複数エージェント向けにテナント単位のコンテキスト層を提供します。ドメインイベントから二時点コンテキストグラフを構築し、カートリッジで各ドメインを定義して事実の来歴を保持します。
主な機能
- 01ドメインイベントから決定的にグラフを構築
- 02テナントごとにグラフと権限を分離
- 03事実の来歴と二時点データを記録
- 04コンテキスト、履歴、検索、関連、注釈のツール
- 05イベントアダプターと複数言語のSDK
活用シーン
- 01製品内の複数エージェントで顧客情報を共有
- 02事実の有効時点と記録時点を追跡
- 03イベントストリームからチームや世帯の情報を構築
- 04意味に基づいて該当する対象を検索
MCP 対応
KeelはMCP経由で5つのコンテキストツールを公開し、エージェントによる照会と注釈の追加を可能にします。HTTP JSON APIにも対応します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
uvx keel-contextKEEL_DBA SQLite file or a mysql:// URL; in memory when unsetKEEL_AGENTThe agent id, when the cartridge declares agentsローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Keel
エージェントごとにパイプラインを作り直すのは、もうやめましょう。
ライブデモ · ドキュメント · ホスト型コンソール(ベータ版) · 理由:4つのエージェントと、顧客コンテキストのコピーを4つ作った
Keelは、製品内のAIエージェント向けコンテキストレイヤーです。垂直SaaS、コンシューマーアプリ、社内ツールなどが対象です。製品のドメインイベントを受け取り、テナントごとの双時制コンテキストグラフを生成します。単位はエンドカスタマー、世帯、チームなど、任意に設定できます。構築するすべてのエージェントが、MCP、HTTP、または型付きSDKを介して、同じ5つのツールからグラフを読み書きできます。
オントロジー、イベントカタログ、セマンティックルール、メモリポリシーを含む カートリッジ に、垂直領域を一度だけ記述します。Keelのコアは、ドメインについて何も知りません。2つ目のエージェントは、数週間ではなく1日で接続できます。2つ目のパイプラインを書く必要がないからです。
サンプルのカートリッジとイベントを使って、1分で試せます。
pip install keel-context
keel init fleet --example fleet # also crm, clinics, finance
keel context fleet fleet/events.jsonl unit:MXK-4821
ステータス:0.34.0、アルファ版。コンテナ:
ghcr.io/angelkurten/keel。MCPとHTTP JSON API(/v1)経由の5つのツール、Postgres、Webhook、Kafka、SQSアダプター、セマンティック検索、統合、エージェントレジストリ、TypeScript、Python、Go、PHP用SDKを提供しています。インメモリストア、SQLite(--db keel.db、標準ライブラリを使用し、サーバーの実行不要)、またはMySQL(--db mysql://...)で動作します。

課題
製品に新しいエージェントを追加するたびに、同じ作業が繰り返されます。顧客データを抽出して正規化し、「重要」とは何かを判断し、独自のメモリを保持し、モデル向けに独自のツールを公開します。エージェントが4つなら、顧客コンテキストのコピーも4つ、「重要」の定義も4つ、互いに連携しないメモリも4つです。
既存のメモリレイヤー(Zep、Mem0、AgentCore Memory、Neo4jのMKG)は、テキストやドキュメントを取り込み、ユーザーまたはエージェントごとにメモリをモデル化します。しかし、ドメインイベントを出発点とするものはありません。また、製品がすでに持つテナント、つまりB2B SaaSのエンドカスタマー、コンシューマーアプリの世帯、社内ツールのチームをモデル化するものもありません。
Keelの特長
- カートリッジ。 垂直領域は、YAMLと数個の10行程度のハンドラーで宣言します。コアは汎用のままです。フリート、クリニック、物流、または独自の製品向けにカートリッジを作成できます。
- ドキュメントではなくイベントを取り込みます。 Keelは、時刻情報を伴う構造化された事実を取り込みます。PostgresのテーブルからCDC経由で、アウトボックス、型付きSDK、Webhook、Kafka、SQS経由で取り込めます。取り込みは決定論的で、低コストです。グラフはテキストから推論されるのではなく、イベントから作られるため、正確です。
- すべての事実が出所情報を持ちます。 ソース、
valid_from、valid_to、recorded_at、修正者を記録します。設計段階から監査に対応しています。 - テナントごとに1つのグラフ。 エンドカスタマー、世帯、チームごとにサブグラフを設け、それぞれに独自の権限と有効期限を設定します。
5つのツールをあらゆるエージェントで
| ツール | 回答する質問 |
|---|---|
context | このテーマについて、現在または過去のある時点で何がわかっていますか?有効な事実、関係、ルールの判定を確認します。 |
history | 時間とともにどのように変化し、いつそれを知りましたか? |
search | どの対象が一致しますか?テキスト、種類、ルール、属性値、または意味で検索します。 |
related | どのようなつながりがありますか?最大3ホップまで確認します。 |
annotate | エージェントや人が証拠とスコープを添えて導き出した結論を記録します。 |
すべてのパラメーターは仕様に記載されています。
search(mode="semantic")は意味に基づいて対象を見つけます。まずクエリ内のIDを検索し、次に高密度検索と語彙検索を統合し、その後、任意で再ランキングを行います。ベクトルの保存場所と使用するモデルは、メモリ内、Chroma、Weaviate、OpenAI互換の任意の埋め込みエンドポイント、または独自のベクトルデータベースとモデルから選べます(方法、例)。
MCP経由で公開し(keel serve)、任意のエージェントフレームワークから接続します。カートリッジでagents:を宣言し、keel serve --agent <id>を実行すると、サーバーがそのエージェントにバインドされます。読み取りと書き込みの権限はエージェントではなく、レイヤーによって適用されます。
クイックスタート
uv sync --extra dev
uv run keel validate examples/fleet --events examples/fleet/events.jsonl
uv run keel ingest examples/fleet examples/fleet/events.jsonl
uv run keel context examples/fleet examples/fleet/events.jsonl unit:MXK-4821
続いて、独自のカートリッジを作成します。docs/first-cartridge.mdを参照してください(20分)。設定(データベース、シークレット、埋め込みキー)は.envに記述します。.env.exampleをコピーしてください(リファレンス)。
独自の製品では、ライブラリとして使用できます。uv add keel-context(またはpip install keel-context)を実行します。インポート文はimport keelです。別の言語から使う場合は、カートリッジから型付きクライアントを生成します。keel sdk typescript|python|go|php examples/fleet -o <file>を実行してください。各言語には小さなランタイムが用意されています(docs/sdks.mdを参照)。
私たちとパイロット運用を始めましょう
私たちのサポートのもと、エージェントと一緒に製品のイベントでKeelを実行できます。1日で始める初回パイロットでは、各ステップの所要時間の目安を含む手順を確認できます。パイロットのリクエストを送信するか、calendar.app.google/3oKUSqXTQPYmjya56で30分の予定を予約するか、[email protected]までご連絡ください。
実際のイベントストリームに接続する
MCPクライアントから5つのツールに接続します。
uv sync --extra mcp
uv run keel serve examples/fleet --tenant acme-logistics --events examples/fleet/events.jsonl
Claude Codeでは、1つのコマンドで登録でき、エージェントには5つのツールだけが表示されます。
claude mcp add keel -- uv run --directory $PWD keel serve examples/fleet --tenant acme-logistics --events examples/fleet/events.jsonl
Codex CLI(OpenAI)も、~/.codex/config.tomlから同じように使えます。読み取り専用の注釈が付いた4つの読み取りツールは、確認なしで実行されます。どちらのクライアントも、同じ5つのツールを通じて同じ質問に回答しました。ツールを提供するを参照してください。バックエンドや、1つのプロセスから複数のテナントを扱う場合も、同じ5つのツールをJSON APIとして使えます。keel serve --transport httpを実行します(OpenAPI対応の/v1/context、/v1/eventsなどを使用し、リクエストごとにテナントとエージェントを指定します)。
製品のイベントは、すでに利用している場所から送信します(方法(各方法の説明))。
- Postgres CDC。製品内にコードは不要です。
keel cdc <cartridge> --dsn postgresql://... --map cdc.yaml --db keel.db --setupを実行すると、独自のテーブルを監視します。各行の変更がイベントになります。 - 型付きSDK。バックエンドから使用します。
keel sdk typescript <cartridge> -o src/keel.tsを実行し、続けてkeel.events([emit.tireDepthMeasured({...})])を呼び出します(Python、Go、PHPにも対応しています)。 - アウトボックステーブル。
PostgresTableAdapterがカーソルを使って順番にポーリングするため、再起動後も続きから再開できます。 - Webhook。
keel serve --transport httpでPOST /v1/eventsを呼び出すか、build_app(ingestor, token=...)を使用します。 - SQSまたはKafka。
keel consume --queue <url>を実行するか、PythonからKafkaAdapterを使用します。少なくとも1回の配信を行い、各コミット後に確認応答します。 - バックフィルやテスト用の**
.jsonlファイル**。keel ingest <cartridge> events.jsonl --db keel.dbを実行します。
keel export <tenant> --db keel.dbは、閉じた事実とプロベナンスを含め、1つのテナントの監査証跡全体をJSONLとして書き出します。keel importを使うと、任意のストアの空のテナントに、元の状態のまま復元できます。
アーキテクチャ
各ボックスとその選択肢、どれを選ぶべきかについては、docs/architecture.md を参照してください。
コアが適用する設計ルール:
- イベントが真実です。 追記専用ログであり、グラフはそこから導出され、再生できます。エージェントや人が書き込んだ内容は、再生後も保持されます。
- コピーではなくポインターです。 グラフには、行、セマンティクス、蓄積されたメモリーへの参照が保持されます。テーブルのコピーは決して保持しません。
- 時間を明示します。 事実は終了し、上書きされることはありません。
- フラットなストアではなく、スコープです。
global>tenant>task>agent。誤ってより広いスコープに昇格することはありません。エージェントのメモリーは書き込んだエージェントのみが読み取れます。タスク ID に紐づくタスクメモリーは、そのタスクを渡す呼び出し(context(task=),history(task=))のみが読み取れます。グローバルメモリーは、すべてのテナントが読み取り、どのイベントも書き込まない予約済みパーティションに保存されます。
リポジトリの構成
keel/ core: envelope, handlers, store, scopes, cartridge loader, ingest, tools, cli
cartridges/ your own cartridges (empty here)
examples/ fleet (reference), crm, finance and clinics: four domains, one core, no core change between them;
each a cartridge, its events and its test; fleet also has a minimal agent and a multi-agent workflow
sdk/ SDK runtimes: typescript, go, php (the Python client ships in keel)
evals/ the semantic-search eval bench
docs/ site sources (mkdocs.yml at the root): architecture, first-cartridge, ingest, serve, sdks, operate, SPEC
tests/
ロードマップ
概要を以下に示します。各リリースで提供された内容を含む計画の全文は、ROADMAP.md を参照してください。
リリース済み:
- イベントエンベロープ、ハンドラーレジストリ、イベント ID による重複排除と再生を備えた決定論的な取り込み
- メモリー内、SQLite、MySQL の二時点ストアと、適合性テストスイートを備えたストアプロトコル
- TTL、証拠ポリシー、有効期限、永続的な事実への統合を備えたメモリースコープ(
keel expire、keel consolidate) - MCP(stdio と HTTP)および JSON API 経由の 5 つのツールと、エージェントレジストリ(人も含む)
- アダプター:Postgres outbox、webhook、Kafka、SQS
- 関係をたどり、所要時間を計測する複合ルール
- トランザクション時刻(
as_known_at)、ウォーターマーク以降の変更、タスク ID、冪等な書き込み、提案、競合、トレース - カートリッジから生成される SDK:TypeScript、Python、Go、PHP
- 一括取り込み(MySQL で 90 秒未満に 100 万件のイベントを処理)
- セマンティック検索:ハイブリッド検索、ID 優先、リランカー、プラグ可能なベクトルインデックスと埋め込みモデル、評価ベンチ
- Postgres CDC:論理レプリケーションで独自のテーブルを追跡(0.28.0)
未完了:
- セマンティック検索の評価ベンチにおける、パイロットからの実際のエージェントクエリ
- カートリッジカタログ、ホスト型 Keel、エンタープライズ機能(2027 年)
論文
Keel:プロダクトエージェント向けの決定論的なコンテキストレイヤー(Zenodo の PDF、ソースは docs/paper/)。3 つの実際の Jira プロジェクトに関する 387 件の質問と 3 つのエージェントを用いた評価では、テナント全体に関する質問において、Keel はプロダクト独自の API を 21~32 ポイント上回り、正解 1 件あたりのコストも最も低くなっています。ハーネスとすべての結果行は evals/jira/ にあります。
@misc{kurten2026keel,
author = {K{\"u}rten, Angel},
title = {Keel: one deterministic context layer for product agents},
year = {2026},
publisher = {Zenodo},
doi = {10.5281/zenodo.23571090},
url = {https://doi.org/10.5281/zenodo.23571090}
}
ライセンス
Apache 2.0。イベントエンベロープ、カートリッジ形式、5 つのツールは標準であり、今後も常に無料で利用できます。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。