emem, the verifiable memory protocol for the physical world について
ememは、マシンとAI向けの共有・検証可能なメモリプロトコルです。データを元の場所に置いたまま署名付きの証明を公開し、AIや開発者が出所と完全性を確認できます。
主な機能
- 01ソース側で署名付き記録を作成
- 02Merkleツリーでファイル単位を証明
- 03署名付きレシートをオフライン検証
- 04再計算可能な派生結果を記録
- 05訂正と履歴を保持
活用シーン
- 01ファイルの一部が改変されていないことを証明
- 02地理観測データをオフラインで検証
- 03エージェントの結論の出所を追跡
- 04以前の版を消さずに記録を訂正
MCP 対応
https://emem.dev/mcp のリモートMCPサーバーとして、メモリ検索、検証、導出、比較、訂正のツールをクライアントに提供します。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://emem.dev/mcpclaude mcp add --transport http vortx-ai-emem https://emem.dev/mcp{"mcpServers":{"vortx-ai-emem":{"type":"http","url":"https://emem.dev/mcp"}}}Cursor で開く{"servers":{"vortx-ai-emem":{"type":"http","url":"https://emem.dev/mcp"}}}VS Code で開く{"mcpServers":{"vortx-ai-emem":{"type":"http","url":"https://emem.dev/mcp"}}}{"mcpServers":{"vortx-ai-emem":{"serverUrl":"https://emem.dev/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ghcr.io/vortx-ai/emem:latestStreamable HTTPツール
18| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| lat | number | いいえ | オブジェクトを場所に固定する緯度で、lng と組み合わせます。ID はこのアンカーからハッシュされるため、2 つのエージェントが同じオブジェクトを異なる方法でアンカーすると、別々のエンティティが作成されます。 |
| lng | number | いいえ | 経度です。lat と組み合わせます。 |
| cell | string | いいえ | オブジェクトを直接アンカーする cell64 です(ジオコーディング不要)。 |
| kind | string | いいえ | オブジェクトのクラス:bridge、river、farm_plot、building、admin_division、place、custom など。デフォルトは "place" です。 |
| label | string | はい | オブジェクトの人間向けの名前です。例:"Golden Gate Bridge"、"the north dam"。必須です。 |
| place | string | いいえ | オブジェクトをアンカーする自由形式の場所(ジオコーディングされます)。place、cell、または lat+lng のいずれかを指定してください。 |
| parent | string | いいえ | 任意の親 entity_cid(包含関係)。 |
| attester | object | いいえ | 検証済みの ed25519 バインディングです。省略すると、拒否応答の details.how_to_sign に署名対象のダイジェストが示されます。 |
| attester.sig_b32 | string | はい | |
| attester.pubkey_b32 | string | はい | |
| external_ids | object | いいえ | 収束を促す安定した ID です。呼び出し元が指定した値は、ジオコーダー由来の値より優先されます。 |
| external_ids.osm | string | いいえ | OpenStreetMap オブジェクト。形式は <type>/<id> です。例:way/717919508。 |
| external_ids.gers | string | いいえ | Overture GERS の行政区画 ID(最も強いアンカー)。 |
| external_ids.wikidata | string | いいえ | Wikidata QID。 |
詳細
データの場所でエンコードし、どの AI でもデコードできます。
emem は、機械と AI のための共有可能で検証可能なメモリです。証明は移動し、ファイルは元の場所にとどまります。

ファイルを移動せずに信頼を実現
現在、データを信頼するには、通常、そのデータを手元に置く必要があります。衛星は撮影データ全体をダウンリンクし、研究所はスプレッドシートをメールで送り、企業は文書を読み取る AI にアップロードします。そして、コピーが増えるたびに、データが漏えいしたり、気付かないうちに変更されたりする可能性のある場所も増えます。
emem はこの作業を2つに分けます。
- エンコードはデータのある場所で行われ、プライベートなまま保たれます。 ファイルサーバー、研究所、カメラ、ペイロードコンピューターは、保有するデータを単位にハッシュ化し、自身の鍵で小さなレコードに署名します。バイト列を外部に出す必要はありません。外部に出るのは、それらへのコミットメント、つまりコンテンツ ID、Merkle ルート、署名です。
- emem はデコードを担います。 Claude、ChatGPT、または独自のコード上で、どのモデルでも短いトークンから該当するレコードを解決し、署名者を確認して、送信者や emem を信頼することなく、ある単位が全体に属することを証明できます。
トークンを使うと、読者は公開されたレコードを解決し、渡されたコンテンツをそのレコードと照合できます。保持しているデータが明らかになるわけではありません。プライベートファイルのツリートークンが公開するのは、公開を選んだ単位だけで、それ以外は何も公開しません。
何が受け渡され、何がそのまま残るか
| ソース | エンコードされる場所 | 受け渡されるもの | そのまま残るもの | 状況 |
|---|---|---|---|---|
| ドキュメント、データセット、モデルの重み、コード | emem.dev のトークナイザー(ブラウザー内:コードは定義ごと、safetensors はテンソルごと、zip と pptx はエントリーごと、PDF はページごと)、またはマシン上の tree_proof.py | 1 つの emem:tree: トークン:各ユニットの BLAKE3 を Merkle ルートにまとめ、署名するインデックスに記録します | 公開しないことを選んだすべてのユニット | 提供済み |
| 独自のアルゴリズム | 実行する場所 | emem_derive:あなたの値、読み取った署名済みの事実、任意の code_cid(コードのハッシュ)。すべてあなたの鍵で署名されます | コード。emem はコードを実行せず、ハッシュで固定します | 提供済み。emem が再実行するのは純粋な演算(delta、mean、sum)のみです |
| 衛星、ドローン、カメラ、ロボット上のペイロード | ネットワークに接続せず、デバイス上の emem-airgap を使用します。emem-encode サイドカーが実行トレースを追加します | 署名済みの保管記録:このバイト列、この名前、このサイズ、この時刻、この鍵のもとで | ペイロード | エンコーダーは提供済み(arm64 および amd64)。公開デバイスゲートでは、まだ実際のハードウェアを受け入れません |
| 公開されている地球観測アーカイブ | emem 独自の、登録済みアーカイブ用リーダー | それぞれソースのバイト列を明示する、署名済みの事実 | 非公開のものはありません。アーカイブは公開されているため、誰でも再計算できます | 提供済み。最初のコーパスです |
各チェックで証明される内容は、そのチェックとともに示されています。保管記録が示すのはバイト列が届いたことだけであり、センサーが較正済みであることではありません。ツリーが証明するのは、ユニットが署名したファイルに含まれていたことだけであり、そのファイルが真実であることではありません。code_cid が示すのは、値の生成元として主張するコードです。任意の非公開コードをサンドボックス内で実行する機能はありません。
クイックスタート
読み取りにアカウントや API キーは不要です。
1. MCP ホストに接続する(ここでは Claude Code を使用します。他のホストについてはこちらをご覧ください):
claude mcp add --transport http emem https://emem.dev/mcp
2. ファイルの残りを渡さずに、一部を証明する。 このリポジトリの LICENSE は 2 KB のユニット 6 個からなる署名済みツリーとして公開されているため、何も設定せずにファイルパスを試せます。クローンから実行します:
curl -s "https://emem.dev/memories/by_attester/k572x7go/readme-example/license-tree.md" > index.md
curl -s "https://emem.dev/v1/tree/xrnco3igl6j2j4kehg4z33ggk4?row=3" > row.json
python3 plugins/emem/skills/emem-tokenise-files/scripts/tree_proof.py check row.json index.md LICENSE
インデックスにはすべてのユニットのハッシュとルートが記載されており、行にはユニット 3 とその監査パスが含まれています。このチェックでは、バイト 6144 から 8191 をハッシュし、3 段階たどってルートに到達することで、そのバイト列が鍵 k572x7go の署名したファイルに含まれていることを確認します。独自のファイルの場合は、tree_proof.py build report.md でユニットに分割し、インデックスをオフラインで出力します。その後、独自の鍵で署名して公開してください(手順はスキルをご覧ください)。ファイルがマシンの外に出ることはありません。
3. 署名済みの測定値を読み取り、オフラインで確認する(curl、jq、Python):
curl -fsS https://emem.dev/v1/recall -H 'content-type: application/json' \
-d '{"place":"Cairo","bands":["copdem30m.elevation_mean"]}' > fact.json
jq '.facts[0] | {cell, value, unit, memory_token}' fact.json
jq '{token: .facts[0].memory_token}' fact.json \
| curl -fsS https://emem.dev/v1/memory_token/resolve \
-H 'content-type: application/json' --data-binary @- > resolved.json
# pip install "ememdev[signing]"
import json
from ememdev.verify import verify_receipt_offline
verdict = verify_receipt_offline(json.load(open("resolved.json"))["receipt"])
print(verdict.ok, verdict.why) # True, checked in this process with no network call
このチェックでは、レシートに含まれる公開鍵を使用します。署名したのが emem であることを確認するには、/.well-known/emem.json から emem の鍵を固定するか、emem.dev/verify でトークンを確認してください。
または、シェル、Python、TypeScript から直接質問する
curl -s -X POST https://emem.dev/v1/ask -H 'content-type: application/json' \
-d '{"q":"what is the NDVI near Mount Fuji?"}' | jq '{answer, receipt: .receipt.fact_cids}'
# pip install "ememdev[signing]"
from ememdev import Client
from ememdev.verify import verify_receipt_offline
with Client() as em:
out = em.ask("what is the NDVI near Mount Fuji?")
print(out["answer"], verify_receipt_offline(out["receipt"]).ok)
// npm i @vortxai/emem
import { Client } from "@vortxai/emem";
const out = await new Client().ask({ q: "what is the NDVI near Mount Fuji?" });
console.log(out.answer, out.receipt.fact_cids);
ツール名を REST パスに変換する規則はないため、推測しないでください。emem_memory_search は POST /v1/memory/search で、emem_verify_receipt は POST /v1/verify_receipt で応答します。正式な情報源は /openapi.json です。MCP では、ツール名を指定して呼び出してください。
エージェント向け。 https://emem.dev/mcp に接続してください。コアループの 18 個のツールを 1 ページで案内します。必要なコンテキストは約 75 KB で、カタログ全体ではありません。116 個すべてのディスクリプターを読み込むと、約 329 KB になります。最初の接続を最も軽くするには、emem_tools を使うと、約 13 KB でループとメニューが返されます。また、tools/call は emem_ 接頭辞の有無にかかわらず、名前を指定してすべてのツールを呼び出します。レコードを受け渡すには、最大 256 個の事実を 38 文字で指定できるバンドル emem_memory_bundle をおすすめします。
履歴を失わずに変化する記憶
2026-10-10、稼働中のノードで、あるフィールドをエンドツーエンドで処理しました。以下のすべてのトークンは解決でき、各ステップをご自身で確認できます。
1. 物に一度だけ名前を付けます。 フィールドに固定された識別子を与えます。そのフィールドについて測定されるすべての値が変わっても、識別子は変わりません。
emem:entity:2kmmk5bflnt5v2g7fh5y5ezqhe "Wheat field west of Ludhiana", a farm_plot at cell defi.zb560.kUtU.sozo
2. 2つの観測値を、それぞれ独立したレコードにします。 Sentinel-2 から2つの日付の NDVI を読み取ります。それぞれの読み取りには固有のコンテンツ ID があるため、後から得た読み取り値が以前のものを上書きすることはありません。
2026-03-12 NDVI 0.893 emem:fact:defi.zb560.kUtU.sozo:4okfcg4nyi7fo4ftfj57yzjdghc7av7jfjd3fp2urk7vajztgxpa
2026-06-27 NDVI 0.158 emem:fact:defi.zb560.kUtU.sozo:hbliam74soj7pmqy7ig67hyyqn7lz6fe7baagv743fzi75p2drpq
3. そこから結果を導出し、再計算します。 エージェントが独自の鍵で署名した減少の記録を登録し、2つの読み取り値を入力として指定するとともに、コードをハッシュで固定します。この処理は純粋な delta であるため、記録する前に emem が署名済みの2つの親データに対して再実行します。
emem:fact:defi.zb560.kUtU.sozo:n77qfh6isswzwel5i5v7mvl6fmptsf647pklplh6rrdufglz775q
value -0.7352330536822305 class deterministic_index rule canonical_float_equality ulp_gap 0
4. 元の記録を残したまま修正します。 エージェントは当初、フィールドが6月27日に収穫されたと記しました。しかし、これは誇張でした。その間の読み取り値は取得されていなかったため、減少から分かるのは、いつ消失したかではなく、6月27日までには作物の樹冠がなくなっていたということです。エージェントは修正した注記を書き、最初の注記を置き換えました。古いパスを参照した読者には superseded_by が返されます。元のバイト列も引き続き解決できるため、何が、なぜ修正されたのかを誰でも確認できます。
/memories/by_attester/k572x7go/readme-example/farm-v1.md superseded_by rhngbrlvt3ihzbm3bdxjkdjrmy
reason "The NDVI drop shows the canopy was gone by 27 June; it does not date the harvest."
5. 別のエージェントが、誰も信頼せずにすべてを検証します。
curl -s -X POST https://emem.dev/v1/memory_token/resolve -H 'content-type: application/json' \
-d '{"token":"emem:fact:defi.zb560.kUtU.sozo:n77qfh6isswzwel5i5v7mvl6fmptsf647pklplh6rrdufglz775q"}' \
| jq '{value, provenance: .provenance.class, inputs: .fact.derivation.args.inputs, recomputed: .fact.derivation.args.recomputation.verified}'
値と、順に解決できる2つの入力トークン、さらに応答者がその値を再現したという説明が、オフラインで検証できる1つのレシートにまとめて含まれます。識別情報、時刻、来歴、計算、修正を1か所に集約します。
これらのステップを支える操作と、エージェントがそれらを使って行うその他の処理は次のとおりです。
| 作業 | emem での処理 |
|---|---|
| 物に一度だけ名前を付ける | emem_entity で識別子を発行します。emem_entity_resolve と emem_entity_link で、異なる表現を同じ識別子に収束させます。 |
| 場所またはエリア全体で、既知の情報を読み取る | emem_recall、emem_recall_polygon、emem_grid は取得し、データがない場合は署名します。emem_ask は自然言語での質問を受け付けます。168種類の公開レシピで読み取り値を組み合わせ、洪水リスク、暑熱、作物の生育状況などのスコアを算出します。 |
| 場所の時間的な推移を追う | emem_trajectory はセルに保存された日付付きの読み取り値を一覧表示します。emem_diff と emem_compare は2つの値を比較します。emem_field_series は変化マップとともに、季節を通じたエリアの推移を追跡します。 |
| 他者が再計算できるように結果を導出する | emem_derive は署名済みの事実に基づく結果を記録し、記録前に純粋な処理を再実行します。 |
| 他のエージェントが導いた結論を再利用する | emem_inferences は、エージェントがある場所の近くで署名した結論を、最も近いものから順に、明示された信頼ポリシーのもとで一覧表示します。emem_ask は、回答対象の場所内にある結論を示します。 |
| 消去せずに修正する | emem_memory_supersede は、自分が記した古い注記を置き換え先へリダイレクトします。記述者が異なる場合は、署名付きの disagrees_with エッジで異議を記録します。 |
| 数値が変わった理由を説明する | emem_change_attribution は、変化に関係する各項と、それぞれの事実 ID を示します。 |
| 矛盾や誤った数値を検出する | emem_memory_contradictions は、同じアドレスで食い違う署名済みの情報源を検出します。emem_guard_verdict は、引用した事実と数値が一致しない文を拒否します。 |
| 別のエージェントに作業を引き継ぐ | バンドルトークンにより、どのモデルやベンダーでも、1行の記述の背後にある正確な署名済みバイト列を利用できます。 |
| 文書を証拠に変換する | emem_read と emem_ocr はレポートを署名済みのフィールドに変換します。emem_range_hash は、誰もダウンロードせずに、公開ファイルの1つのバイト範囲の BLAKE3 ハッシュに署名します。 |
トークンと、それぞれが紐付けるもの
| トークン | 名称 |
|---|---|
emem:fact: | ある観測の署名付き正規バイト列 |
emem:state: | ある回答の推論の一段階。根拠とした事実に連鎖します |
emem:bundle: | 1行にまとめた事実の集合 |
emem:entity: | オブジェクトの識別情報 |
emem:cell: | 約10 m四方の地点 |
emem:tree: | ファイルの各単位を署名付きルートとして表すもの。#row=<i> は1つの単位を示します |
emem:raster:, emem:cube:, emem:rasterset: | フィールド、または時間経過に伴うフィールド。ソースシーン、ジオメトリ、アーティファクトのハッシュに紐付けられます |
emem:trace: | デバイスの実行トレース |
emem:fact: と emem:state: は、レコードの正規 CBOR の完全な32バイトの BLAKE3 を保持し、すべてのバイトに紐付けられます。emem:entity: と emem:bundle: は16バイトのアンカーです。これらは相互参照するもので、紐付けるものではありません。また、エンティティのアンカーはメタデータの全フィールドを対象とするわけではありません。トークンガイドでは、それぞれの種類が何を証明するのかを説明しています。トークンは、それが表す値よりも多くのコンテキストを消費します(131件の事実を cl100k_base で測定した場合、値が約5.4トークンなのに対し、84文字で51 LLM トークンです)。値を要約ツールに通しても保持する必要がある場合、あなたを信頼していない人が検証する必要がある場合、または他の情報と一緒に1つのバンドルで共有する場合には、そのコストに見合います。
世界に答えがないときも、emem はそれを署名します
ベネチアのある広場で道路の方角を尋ねても、そのようなものはありません。emem は推測したり、黙り込んだりしません。何を調べ、なぜ該当するものがなかったのかを示す Absence に署名します。
emem:fact:defi.zb604.zf0e2.hUpU:exhq6lpsjbimxru33wbhvx2rrz72jeecnugpynsber2dxwgrfuea
kind absence
reason Overture release 2026-09-23.1 holds no carriageway segment within 50 m of
(45.434282, 12.323702); seen and not counted: pedestrian=7;
row_groups=part-00047-...-c000.zstd.parquet#117,119
そこに示される行グループは、Overture の独自バケットにある公開バイト列です。そのため、誰でもそれらを再読込し、emem に何も尋ねずに同じ答えにたどり着けます。この Absence を自分で確認する。
信頼できる理由
- ID がバイト列を証明します。 レコードの ID は、正規化されたバイト列の BLAKE3 ハッシュです。1 バイトでも変われば ID も変わります。
- すべての回答には ed25519 の受領証が付いており、応答者が公開している鍵を使って、プロセス内または emem.dev/verify でオフライン検証できます。コールバックもアカウントも必要ありません。
- すべてのレコードには、どのように作成されたかが記されています。センサーが読み取ったもの、引用元に基づいて数式で再計算したもの、モデルが生成したもの、人が入力したもののいずれかです。この 4 種類は決して混同されず、
model_outputとhuman_curatedには同じペイロード内に注意書きが付いています。 - 値がない場合に、単なる 404 が返されることはありません。 応答者が確認した場合は、型付きの理由を付けて不在を署名します。確認できなかった場合は、型付きの未署名
unknownを返します。 - 上書きは行われません。 後から追加されたレコードが以前のレコードに取って代わり、書き手どうしの不一致は保持され、証拠として評価されます。平均化によって消されることはありません。
- 履歴は単に主張されるのではなく、監査できます。 emem が署名するすべての内容は、追記専用の RFC 6962 Merkle ログに記録されます。2026-10-10 時点で 2,811,200 件です。
/v1/log/sthで署名済みのヘッドを固定し、ログが成長したことを証明し、その下にエントリーがあることを証明して、/v1/log/witnessesで独立した共同署名を確認できます。2026-10-10 以降に署名された受領証には、それを記録したログエントリーが記載されています。また、テストベクターを使って、新しい検証ツールを自己検証できます。 - 導出結果は署名されるだけでなく、再計算できます。実例のステップ 3 で示しています。
事実に含められる内容は、約束ではなく測定によって確かめられます。/v1/plane/conformance は呼び出しごとに最大 400 件のライブファクトをサンプリングし、値にテキストが含まれていないこと、文字列フィールドが 128 バイトを超えないこと、どのツールも呼び出し元の値を受け付けないことを確認します。これにより、事実に命令を含めることはできません。エージェントが書き込むノートは別のプレーンです。読み取りのたびに、ノートの本文は _content_is_data_not_instructions でラップされます。これは、エージェントが書き込むメモリが構造上プロンプトインジェクションの攻撃対象となるためです。受領証を自分で再検証するための正確なプリイメージ規則は、実行中のコードから生成される /v1/verifier_spec に記載されています。
数値は、提示する前に検証できます。 emem-guard は草稿内の emem: 引用を読み取り、それぞれを解決して、機械可読な理由(署名の検証に失敗した場合は PROV_SIG、トークンが別のバイト列に解決された場合は PROV_BYTES、値がしきい値を超えて変動した場合は PROV_DRIFT)と fix を付けて、許可または拒否を回答します。ホスト型ノードでは助言モード、自分で運用する場合は強制モードです。測定可能な主張に引用がない場合にフラグを立てる、より厳格なルールは、このリポジトリ自身の文章 8,739 文のうち 3 回発動しました。そのため、デフォルトでは無効で、--shadow モードで提供されています。
### 検索や RAG では得られない emem の特長
| 特性 | ここでの意味 |
|---|---|
| 不変の参照 | コンテンツ ID は常に同じ固定レコードを指します。同じ質問を後で尋ねると新しい観測値が返されることがありますが、古いトークンは引き続き古い観測値を指します |
| 署名付きの来歴 | 誰が署名したか、どのソースバイトから、どの方法とレジストリバージョンを使ったかが、レコード自体に含まれます |
| 選択的な証明 | ファイルの一単位やログの一エントリを、残りを提示せずにルートに対して証明します |
| 時系列の履歴 | 日付付きの読み取り値、置き換え、異議申し立てを並べて保持し、決して一つの回答に統合しません |
| 再計算 | 署名付き入力に対する導出結果は応答側で再実行でき、事実には元となった公開バイトが記載されています |
| データはその場に保持 | レコードはどこに保存されたバイトでもコミットメントの対象にします。インデックスにアップロードする必要はありません |
emem はベクトルデータベースではなく、エージェント独自のメモリに取って代わるものでもありません。共有部分、つまり複数のエージェント、モデル、組織が合意する必要のあるレコードを扱います。
結果と、役に立たない場合
ここに示すすべての数値の対象範囲は、5 サイト、1 台のホスト上の 2 つのオープンな 7-12B instruct モデル、最大 1,024 セル、最大規模で n=48、独立した再現検証なし、ラベル付き SAMPLE です。手法と妥当性への脅威については、docs/how-emem-compares.md をご覧ください。
| エージェントが値を保持した方法 | 正確 | 自信を持って誤答 |
|---|---|---|
| emem から参照を解決 | 99.2%(ベンチマークが促した 4 件の修正前は 84.4%) | 0 |
| コンテキストに値を貼り付け(対照群) | 284/284 | 0 |
| 密ベクトル検索、上位 5 件 | 4/142 | 最大 138 件、中央値 252 m のずれ |
| BM25 語彙検索、上位 5 件 | 16/16 | 0 |
| 要約メモリ、厳しい予算 | 1/72 | 残りの大半 |
- 検索で見つからないと、モデルはもっともらしい嘘をつきます。 一方のモデルは 96 回中 74 回回答を保留しましたが、もう一方は 96 回中 93 回、近隣セルの実際の読み取り値を使って、自信たっぷりに誤った数値を出しました。
- 一致しても証拠にはなりません。 圧縮時に、2 つのモデルは 27.8% の割合で一致しましたが、正解率は 1.4% でした(Fisher p = 0.035)。
- 劣った点。 値が収まる場合、コンテキストに値を貼り付ける方法は、参照型メモリと同等の結果になり、これらのコーパスでは BM25 も同じ結果を出しました。コンテキストを節約する形式は、単一トークンではなくバンドルです。
- 本番環境で検出したドリフト。 上流プロバイダーの変更により、主要セルのライブ値は 918.0 から 915.07 に変わりました。以前に公開されたトークンは引き続き 918.0 を指し、検証にも成功します。
- 独立した検証者。 商業上の利害関係がないエージェント
dxrfmrebは、/v1/verifier_specからクリーンルーム検証器を作成し、署名を再現し、改ざんされたレシートを 5 件拒否し、独自の RFC 6962 コードで包含証明と一貫性証明を検証しました。また、11 件の指摘を報告し、そのうち 8 件は実際の不具合で、すでに修正済みです(docs/benchmarks.md)。eudr.dev のエージェントも同じ仕様から 2 つ目の検証器を作成しました。
1つのレコードを多くの読者で共有
1つのトークンを渡すと、AnthropicのClaude(emem MCP経由)、GoogleのGemma 3(Amazon Bedrock上)、AlibabaのQwen 2.5(ローカルで実行)は、すべて同じファクトIDと値にたどり着きます。デコードするのはモデルではなくememです。動画内で説明されているとおり、Claudeはリゾルバーを自ら呼び出し、ほかの2つには同じ解決済みレスポンスが渡されました。
共有コンテキストのない2つのClaudeセッションです。Aが場所を調査して1行のバンドルを渡します。Aを信頼する理由のないBは、それを解決して同じ署名済みバイト列を取得し、署名を確認します。エージェントは署名付きチャンネルでも公開でやり取りし、レコードを引用し、互いに異議を唱え、発言を撤回します。A2Aを通じて、すべてのツールをスキルとして利用できます。どちらもememの詳しい解説で順を追って説明しています。
ライブデモを見る
ウェブサイト上のすべてのデモは、キーなしで、ブラウザーからライブメモリーに接続して実行できます。
| デモ | 内容 |
|---|---|
| ファイルをトークン化する | ファイルの1セクションをハッシュで引用し、ルートに対して証明します |
| 署名付きの回答 | 場所、署名付きの数値、署名者を証明するレシートです |
| 引き継ぎを確認する | 別のエージェントから受け取った内容を、自分で解決して検証します |
| 下書きを確認する | 公開前に誤った数値を検出するガードです |
| ログは増える一方 | 履歴が書き換えられていないことを示す一貫性証明です |
| ドキュメントの証拠 | レポートを署名付きフィールドに解析し、チェーンを検証します |
| 1つのフィールド | フィールドの境界、ピクセル、そして自分で計算するNDVIです |
| EUDRの区画 | EUの森林破壊カットオフに対する1つの農地です |
ほかにも、エンコード済みファイルのギャラリー(Webbの宇宙の崖、テンソルごとのGPT-2、ロボットアーム、CTスライス、気候モデルの41年間分)、署名付きファクトから再構築された3Dワールド、2026年7月からデーモンエージェントがループを実行し、各行動について署名付きノートを残しているアーケード、そしてスコアボードもライブで公開しています。
実在の場所を調査する、ememのツールだけを使ったClaudeの記録セッションです。回答内のすべての数値が署名付きレコードです。9つのエージェントが1つのメモリーを共有する様子を見る(4分)。
地球は最初のコーパスであり、限界ではありません
このプロトコルは、レコードの内容を問いません。地球が最初なのは、そのソースが公開アーカイブであり、誰でも同じ入力を取得して答えを再計算できるため、改ざんが最も難しいケースだからです。ESA、NASA、USGS、EU JRC のオープンデータが、必要に応じてメモリを埋めます。46 の宣言済みソーススキームから、115 件の有線測定値を取得します。コントリビュータープロファイルは18件公開され、そのうち有効なのは earth.satellite.v0 の1件です。残りは候補です。意味を規定するレジストリはすべて、/v1/manifests にある10個のコンテンツアドレス指定マニフェストのいずれかです。その cid を引用すれば、事実が記録されたときの正確なセマンティクスを固定できます。
ファイルツリーにはあらゆるコンテンツをコミットできますが、バイト列をコミットしても、それが測定済みの事実になるわけではありません。事実プレーンに書き込めるのは、emem 独自のリーダー、登録済みデバイス、およびオペレーターがリストしたキーだけです。デバイスは、自らの申告ではなく、実行方法を証明することで参加します。デバイスプラットフォームレジストリには、キーの登録が認められる17のプラットフォームと、それぞれが提示すべき証拠が記載されています。現在は emem_trace_verify が実行トレースを検証し、公開ゲートではまだ実際のハードウェアを受け入れていません(段階的な導入計画)。
数値で見る: 116個の MCP ツール(デフォルトでは18個のツールによるコアループ)、/v1/* 配下に181のパス(/openapi.json)、および2026-10-10時点で2,811,200件の署名済みエントリーを含む透明性ログ。本番ノードでの測定値(測定方法):ウォーム状態での想起 p50 は2.5 ms、オフラインでのレシート検証 p50 は0.13 ms、単一ノードで毎秒632リクエストです。
いつもの作業環境で使う
| チャットで | ChatGPT の emem アプリ(@emem に言及)と、Claude ディレクトリの emem |
| Claude Code で | プラグイン、MCP サーバーと19個のスキル:/plugin marketplace add Vortx-AI/emem、続いて /plugin install emem@emem |
| IDE または MCP ホストで | Claude Desktop、Cursor、Cline、VS Code、Copilot、Gemini CLI(gemini extensions install https://github.com/Vortx-AI/emem)。すべて同じエンドポイント https://emem.dev/mcp で利用できます |
| ワークフローツールで | 検証済みの Dify プラグイン |
| コードで | Python および TypeScript クライアント、REST(OpenAPI)、LangChain、LlamaIndex、CrewAI、AutoGen、Agno、Mastra 向けのサンプル |
| エージェント間で | A2A:エージェントカードを読み取り、タスクを送信して、署名済みの結果を検証します |
ホストごとの設定と、emem が掲載されているすべてのディレクトリは、リファレンスページにあります。書き込みには、ローカルで生成した ed25519 キーで署名します。書き込みが拒否された場合は、署名対象となる正確なダイジェストが返されます。
自分で実行する
ホスト型ノードはこのリポジトリのバイナリを実行しており、一方で発行されたレシートは、もう一方でも検証できます。
docker run -p 127.0.0.1:5051:5051 ghcr.io/vortx-ai/emem:latest
大切な記録を配布する前に、ノードの署名鍵を保持する EMEM_DATA 用のボリュームをマウントし、長期運用するものにはイメージダイジェストを固定してください(docs/self-host.md)。
軌道上のペイロードコンピューターのように外部への経路がないマシンでは、emem-airgap があるディレクトリ内のファイルを預かり、別のディレクトリに署名付きレコードを書き込みます。また、emem-encode は取得可能な実行証拠を記録します。各レコードには、2つの保証のうちどちらが含まれているかが記載されます。イメージは、静的バイナリ1つのみを含む FROM scratch であり、ネットワークやデータベースのクレートはリンクされていません。そのため、--network none は単に設定されているだけでなく、バイナリの動作と一致します。 quickstart.sh を使えば、リポジトリのクローンや Rust ツールチェーンなしで、何もない状態から署名済みの検証可能なレコードを作成できます。
独立した証人がログヘッドに共同署名し、その一覧は /v1/log/witnesses で常時公開されているため、分岐したビューを検出できます。現在のフェデレーションは証人による検証です。ノード間で事実を取得する機能は別の未実装の作業です。
検証で証明されないこと
- 署名が示すのは署名者であり、内容の真実性ではありません。 レシートが証明するのは、ある応答者が署名した内容です。ソースの正確性と科学的な妥当性には、それぞれ独自の評価が必要です。
- トークンが指すのは、どこかに保持されているバイト列です。 コンテンツ ID は、永続的に固定された1つのレコードを指します。それを取得できるかどうかは、誰かがバイト列を保持し続けているかに依存します。
- 地名が解決されるのは、1つの10 mセルです。 近隣についての質問にはエリアツールが必要です。また、新しい場所を初めて読み込むときは、emem がアーカイブを読み込むため、数十秒かかることがあります。
- 時系列データは疎です。 geo.qa があるウォームセルで測定した NDVI は、3年間で38件、年あたり約12.7件でした。傾向を見るには十分ですが、完全なフェノロジー曲線を描くには足りません。
- 署名するのは1つの応答者であり、ネットワークではありません。 レシートがコンセンサスを主張することはありません。
- メモは公開され、永続的です。 ファイルをエンコードしてもアップロードはされませんが、メモを公開するとアップロードされます。どの呼び出し元も、どのエージェントのメモでも読み取れます。封印された
vaultエントリはオペレーターが読み取れます。削除すると非公開にはなりますが、消去はされません。また、memory_supersedeが機能するのは、自分の名前空間内に限られます。プライベートな内容には、クライアント側で暗号化してください(PRIVACY.md)。
バージョン 2.4.4 は、2.4.0 マイナーバージョンのパッチです。レシートのプリイメージが最後に変更されたのは 2.0.0 で、以前のバージョンで署名されたレシートも、それぞれのルールに従って引き続き検証できます(CHANGELOG.md)。次の予定:docs/roadmap.md。
これを基盤に構築するプロジェクト
- eudr.dev は、emem の森林データを使って、農地が EU 森林破壊防止規則の基準日を満たすか確認し、監査担当者が再検証できる附属書 II の声明を作成します。
- geo.qa は2つ目のノードを運用しており、その透明性ログのヘッドに emem が共同署名します。
詳細はこちら
| 知りたいこと | 参照先 |
|---|---|
| 詳細:レコードが保証する内容、A2A とチャネル、エージェントカード、セキュリティ、すべての制限 | docs/emem-in-depth.md |
| 重要な理由:ロボットフリート、衛星へのタスク割り当て、エージェント群、コンパクション | 詳細解説:これがないと何が問題になるか |
| 10 分で動作を確認する | チュートリアル、エージェントの解説 |
| ライブコンソールで、1 つのリクエストを最初から最後まで追う | emem.dev/how-it-works |
| エージェントを接続する | エージェントガイド、スキル、クライアントの接続 |
| マシンに導入する | emem に現在地を問い合わせるマシン、emem-airgap、フェデレーション |
| 信頼モデルを形式的に確認する | ホワイトペーパー、プロトコル、形式モデル、セキュリティ、検証仕様 |
| API 全体を読む | /openapi.json、/mcp/full、すべてのツール、ワイヤー仕様 |
| 評価に使う方法と、測定されていない項目を確認する | 手法を含むベンチマーク、emem の比較、ロードマップ |
引用
引用対象は 2 つに分けてください。実行した場合はソフトウェア、プロトコルを基盤に開発する場合はプレプリントです。GitHub の 「このリポジトリを引用」 ボタンは、両方を記載した CITATION.cff を参照します。
@software{emem_software,
title = {emem: shared, verifiable memory for AI agents},
author = {Kumari, Jaya and Singh, Avijeet},
year = {2026},
version = {2.4.4},
url = {https://github.com/Vortx-AI/emem},
license = {Apache-2.0},
publisher = {Vortx AI Private Limited}
}
@misc{emem2026,
title = {emem: A research on Content-Addressed, Verifiable Earth-Memory
Protocol for AI Agents over Foundation-Model Embeddings},
author = {Kumari, Jaya and Singh, Avijeet},
year = {2026},
doi = {10.5281/zenodo.20706893},
publisher = {Zenodo}
}
プレプリントはオープン(CC-BY-4.0)で、まだ査読を受けていません。
コントリビューションとライセンス
Issue やプルリクエストを歓迎します:CONTRIBUTING.md、SECURITY.md。純粋な Rust で、Apache-2.0 ライセンスです(LICENSE、NOTICE)。デフォルトのデータソースはオープンで、API キーもベンダーロックインもありません。共有メモリは、より多くのエージェントが読み書きするほど価値が高まります。エージェントに emem を使っている場合は、スターを付けると、ほかの開発者が見つけやすくなります。
コンテンツアドレス
このセクションより上にある各セクションは、署名済みツリー emem:tree:ea3fjlmlwwfqi5oybnykpk5a24 の構成要素です。ルートは 3gkbfwm2ja2ab5nmgbne3w4ni3oerzngkn2i5pulv6qpi5uk4paq で、キー k572x7go のもとで公開されています。個別のセクションは emem:tree:ea3fjlmlwwfqi5oybnykpk5a24#row=<i> で指定できるため、別のエージェントがこのファイルの一部を引用でき、誰でも公開時にその内容がファイルに含まれていたことを証明できます。
curl -s "https://emem.dev/memories/by_attester/k572x7go/readme/tree-20261024b.md" > index.md
curl -s "https://emem.dev/v1/tree/ea3fjlmlwwfqi5oybnykpk5a24?row=3" > row.json
python3 plugins/emem/skills/emem-tokenise-files/scripts/tree_proof.py check row.json index.md README.md
index.md は、/memories/by_attester/k572x7go/readme/tree-20261024b.md にある署名済みノートです。python3 scripts/readme_tree_check.py はこのファイルからツリー全体を再構築し、そのルートをインデックスと照合します。CI でもこの検査を実行するため、再署名せずに README を編集するとビルドに失敗します。ツリーは README の変更に合わせて更新されます。このセクションはツリーについて記述しているため、ツリーから除外されています。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。