Skip to main content
Glama
Lyellr88

marm-memory

ライセンス Python FastAPI Docker Pulls PyPI Downloads PyPI Version MCP Registry

Discord Publish CodeQL marm-memory MCP server

コントリビューション歓迎! オープンイシューを参照してコントリビュートするか、MARM Discordに参加してワークフローを共有したり、セットアップのヘルプを受けたり、他のビルダーとつながりましょう。

目次

Related MCP server: Memory Crystal MCP Server

クイックスタート

  1. インストールして、好みのエージェントプロファイルで初期化します:

pip install marm-mcp-server
marm-memory init --g-claude --g-codex --g-gemini

利用可能なオプション: --g-qwen と --g-kiro。フラグなしで実行すると、ホームではなく現在のプロジェクトフォルダにインストールされます

  1. AIコンパニオンに引き継ぎます。エージェントに次のように伝えてください:

"marm-initスキルを使ってMARMをセットアップしてください。"

  1. 操作:エージェントがセットアップ全体(Python/Docker、HTTP/STDIO、キー、クライアント設定)をチャット内でインタラクティブに処理します。

手動セットアップ

自分で設定したい場合:

"agent"をクライアントのCLIコマンド(例:claude、gemini、qwen)に置き換えてください。Codexの場合は、代わりに codex mcp add marm-memory --url http://localhost:8001/mcp を使用します。

あなたのタイプ...

サーバーを起動

MCPクライアントに接続

ソロ開発者/研究者

marm-memory start

"agent" mcp add --transport http marm-memory http://localhost:8001/mcp

プライベートローカルSTDIOユーザー

marm-mcp-stdio

"agent" mcp add --transport stdio marm-memory-stdio marm-mcp-stdio

メモリーを共有する複数エージェント

marm-memory start --profile swarm

"agent" mcp add --transport http marm-memory http://localhost:8001/mcp

プライベート高スループットスウォーム

marm-memory start --profile swarm-max

"agent" mcp add --transport http marm-memory http://localhost:8001/mcp

信頼できるプライベートラボ/サーバー

marm-memory start --profile trusted

"agent" mcp add --transport http marm-memory http://localhost:8001/mcp

  • ⚡ 最速のHTTP起動:marm-memory fast-start-http を実行してローカルランタイムを起動し、コンソールを起動してブラウザですぐに開きます。

  • 🖥️ Webコンソール:marm-memory console を実行してローカルUIアプリを即座に表示します(Node.jsは不要)。

  • ⚙️ ライフサイクル管理:status、logs --follow、restart、stop を使用してバックグラウンドデーモンを管理します。

  • 💡 クイックフラグ:--no-console または --no-browser を使用して起動を制限します。完全なコマンド一覧は marm-memory --help を実行してください。

MARMメモリーの利点

あなたのAIはすべてを忘れます。MARMメモリーは忘れません。

marm-memoryは、エージェントにプライベートで共有可能なメモリーを提供し、チャット間で失われがちなコンテキスト(決定、調査、修正、メモ、プロジェクト履歴)を保持します。Claude CodeからCodexやGeminiに切り替えても、すでに収集したコンテキストを失うことはありません。

これは3つの要素を統合します:

  • 🧠 コアメモリー(7つのツール) 会話、メモ、ノートブックエントリ、要約を保存し、検索可能に保ちます。

  • 💻 コードグラフ(5つのツール) リポジトリをマッピングし、エージェントがシンボルを見つけ、コードパスを追跡し、すべてを再読することなくプロジェクトを理解できるようにします。一度リポジトリを指定すれば、作業中に最新状態を維持します。

  • 🧩 概念グラフ(2つのツール) 保存されたメモリーから人物、決定、エラー、アイデアを結びつけ、利用可能な場合は関連するコードへのリンクも提供します。メモリーを保存するたびに自動的に構築されます。

14のツールすべてがHTTPとSTDIOの両方で動作します。エージェントは毎回ゼロから始める代わりに、セッションをまたいで同じローカルメモリーを共有します。組み込みのコンソールを使用すれば、保存された内容を確認および管理できます。

仕組み

レイヤー

機能

重要性

メモリーモデル

セッション、構造化ログ、ノートブック、要約、セマンティックメモリー

プロジェクトの履歴を一つのチャットに閉じ込めず、検索可能に保つ

スケールレイヤー

SQLite WALモード、コネクションプーリング、シリアル化された書き込みキュー、HTTPレート制限プリセット

1台のサーバーでソロ利用、マルチエージェント作業、スウォームスタイルのバーストに対応

インテリジェンスレイヤー

FTSフィルター、セマンティック再ランク、境界付きセマンティックフォールバック、自動分類、書き込み時統合、コンパクション候補

メモリーが増えても重複が積み重なることなく、有用な想起を維持

コードグラフレイヤー

リポジトリインデックス作成、シンボル検索、呼び出しトレース、アーキテクチャ概要、変更影響分析

エージェントがコードベース全体を再読せずにプロジェクト構造を把握

概念グラフレイヤー

保存されたメモリーからのエンティティと関係性の抽出、コードグラフへのリンクバック

決定、エラー、ツール、人物をセッション間で結びつけ、フラットなテキストのままにしない

トークンレイヤー

軽量な7ツールコアサーフェス(バンドルグラフツールを含めて14)、検索前のセマンティック再ランク、書き込み時重複排除

想起ごとにモデルに送信されるトークンを削減し、メモリーが拡大してもコストを予測可能に保つ

デプロイメントレイヤー

Pip、Docker、STDIO、HTTP、管理された swarmswarm-maxtrusted プロファイル

プライベートなローカルメモリーまたは共有マルチエージェントメモリーを同じMCPサーフェスで実行可能

パフォーマンスとスケーリングのベンチマークについてはパフォーマンス&スケーリングベンチマークを、各レイヤーのメカニズムについてはアーキテクチャと内部構造を参照してください。

ランタイムCLIコマンド

marm-memory は Python パッケージと共にインストールされるローカルランタイムマネージャーです。以下は通常の運用コマンドです。フラグやコマンド固有の例については marm-memory <command> --help を使用してください。

日常のランタイム作業

marm-memory fast-start-http                # start HTTP, Console, and open the browser
marm-memory start                          # start or reuse the managed HTTP runtime
marm-memory start --profile swarm          # shared multi-agent preset
marm-memory stop                           # stop the managed runtime safely
marm-memory restart                        # restart the managed runtime
marm-memory status                         # inspect runtime, database, queue, and graph status
marm-memory logs --follow                  # follow bounded runtime logs
marm-memory console                        # start or reuse the bundled local Console

トランスポートとセットアップ

marm-memory http                           # run HTTP in the foreground
marm-memory stdio                          # run the strict local MCP STDIO transport
marm-memory init                           # install the MARM skill into detected agents (project scan)
marm-memory init --g-claude                # install the skill into the home-folder claude directory
marm-memory doctor                         # diagnose the local install
marm-memory key init                       # create or reuse ~/.marm/.env without displaying the key
marm-memory key path                       # print the managed key-file path
marm-memory key reveal                     # explicitly display the managed key
marm-memory console --import-key           # open an authenticated local Console session
marm-memory upgrade --check                # compare the installed package with PyPI
marm-memory uninstall                      # preview package removal; always preserves ~/.marm

ナレッジ、プロジェクト、メンテナンス

marm-memory knowledge status               # Indexers, models, and how far behind automatic indexing is
marm-memory knowledge build --all          # Rebuild the whole concept graph (new memories index themselves)
marm-memory knowledge auto off             # Stop indexing memories automatically (on, off, status)
marm-memory projects list                  # List all tracked workspaces
marm-memory projects index <path>          # Add a repo to the code graph (kept current after that)
marm-memory projects status                # Inspect target repo graph readiness
marm-memory projects auto off              # Stop re-indexing repos automatically (on, off, status)
marm-memory maintenance status             # Check internal database optimization state
marm-memory maintenance embeddings migrate # Upgrade old 384-dim vectors to 512-dim
marm-memory maintenance chunks rechunk     # Recalibrate long memory text splits

Dockerコマンドは、明示的なデータマウント、ネットワーク公開、キー処理の選択が必要なため、以下に別途文書化されています。

パフォーマンスとスケーリングのベンチマーク

MARMは、メモリーが増え、長いメモリーがバックグラウンドでチャンク化されても、高速な想起を優先して調整されています。

これらの測定値は、fastembed対応の jinaai/jina-embeddings-v2-small-en エンコーダーと、使い捨てのローカル SQLite データベースを使用しています。すべての計測パスは、出荷された MARMMemory コードを呼び出しており、ベンチマークローカルでの再実装ではありません。セクション1〜4は、ローカルハードウェアでの scripts/benchmarking/performance/bench_hotpath.py の単一実行からのタイミングです。絶対的なミリ秒数はマシンによって異なりますので、スケーリングの形状をシグナルとして扱ってください。セクション5は別の精度ベンチマーク(run_eval.py)であり、その理由から2回の実行結果を報告しています。

1. 検索レイテンシのスケーリング

エンドツーエンドの recall_similar レイテンシ(クエリエンコードを含む)

セッションサイズ ($N$)

最小レイテンシ

中央値レイテンシ

p95レイテンシ

N = 100

7.4 ms

7.9 ms

9.4 ms

N = 250

11.9 ms

13.5 ms

15.4 ms

N = 500

10.9 ms

11.8 ms

13.4 ms

N = 1,000

13.3 ms

13.5 ms

15.6 ms

N = 2,000

17.5 ms

18.2 ms

19.6 ms

N = 4,000

23.8 ms

25.9 ms

30.9 ms

小さな $N$ では実行ごとのばらつきが隣接サイズ間の差よりも大きいため、ここでは N = 250 が N = 500 よりも遅く読み取れています。N = 1,000 から上のトレンドを実際のシグナルとして扱ってください。

2. エンコーダー+並行性

  • コールドモデルロード: 893ms

  • ウォームエンコード: 中央値 3.8ms、p95 4.3ms

  • 並行検索: 10回の収集された検索が 151.5ms で完了、シリアルは 176.0msgather/serial = 0.86)。これを並列処理と見なさないでください。同じベンチマークの繰り返し実行では 0.63 から 0.86 の範囲に収まるため、比率は速度向上を主張するほど安定していません。パスは設計上、共有エンコーダーとSQLiteの処理を中心にシリアル化されており、見かけ上の利得は測定ノイズです。

3. 書き込み時取り込みコスト

  • 統合オフ: 中央値 6.5ms、p95 7.6ms

  • 統合オン: 中央値 58.1ms、p95 106.5ms

  • トレードオフ: 書き込み時の重複排除/クラスタリングにより中央値で 9.0x のコストが追加されますが、想起は高速に保たれ、ストアは長期的にクリーンな状態を維持します。統合はデフォルトでオフです。

4. 検索スケーリング:フルスキャン vs プロダクションハイブリッド

なぜメモリが増えてもリコールが横ばいなのか:すべてのベクトルをスキャンする代わりに、プロダクションリコールはFTSキーワード事前フィルターを使用して候補プールを絞り込み、その後、セマンティック + BM25 + 時間的スコアをブレンドしたもので再ランク付けします。両方のベンチマーク列は、生のエンコードオーバーヘッドから検索速度を分離するために、事前計算されたベクトルでタイミングを計測した、本物の非同期コードパスを表しています。テストは交互に実行され、完全に偏りのないキャッシュ状態を保証します。

セッションサイズ ($N$)

フルセマンティックスキャン

プロダクションハイブリッド

高速化

FTS候補数

N = 100

3.3 ms

6.6 ms

0.5x

85 / 200

N = 500

16.3 ms

11.6 ms

1.4x

200 / 200

N = 1,000

31.1 ms

14.7 ms

2.1x

200 / 200

N = 2,000

63.5 ms

19.0 ms

3.3x

200 / 200

N = 4,000

127.2 ms

29.1 ms

4.4x

200 / 200

N = 10,000

316.7 ms

53.8 ms

5.9x

200 / 200

フルスキャンは$N$にほぼ比例して増加しますが、ハイブリッドリコールの増加ははるかに遅いため、セッションサイズが大きくなるにつれてアドバンテージはさらに広がります。非常に小さい$N$では、事前フィルターはそのオーバーヘッドに見合わず、ハイブリッドの方が遅くなります。

5. LoCoMo検索精度

10個のLoCoMo会話すべてがmarm_log_entry(5,882メモリ)を通じて取り込まれ、その後、トップ5のmarm_smart_recall結果が1,977のエビデンス注釈付き質問に対してスコアリングされます。回答生成モデルやLLM判定は使用されません。

設定

いずれかのエビデンスヒット

全エビデンスヒット

平均エビデンスリコール

MiniLMベースライン

37.5%

29.5%

未公開

Jina v2 Small (v2.29.0)

53.0%

43.4%

47.6%

Recent (v2.33.1)

62.9 - 63.5%

53.1 - 53.5%

57.4 - 57.9%

パフォーマンスの向上は、ブレンドされた検索パイプラインとローカライズされたベクトル空間に限定されており、クラウドホスト型のLLM判定に依存せずに高いマルチホップリコール精度を保証します。完全なベンチマークは、scripts/benchmarking/accuracy/locomo/run_eval.pyを使用して再現してください。

6. 競合他社との比較:アーキテクチャ

MARMは特定のニッチをターゲットにしています。MCPに接続されたコーディングエージェント向けのローカルファーストメモリであり、汎用のパーソナライゼーションメモリや完全なエージェントランタイムではありません。AIエージェントメモリの確立された名前とは、アーキテクチャ的に以下のように異なります。

MARM

Mem0

Letta (MemGPT)

Zep / Graphiti

agentmemory

タイプ

メモリエンジン、MCPネイティブ

メモリレイヤーAPI

完全なエージェントランタイム

時間的知識グラフ

メモリエンジン、MCPネイティブ

必要なインフラストラクチャ

個別のデータサービス不要(組み込みSQLite)

ベクトルDB (Qdrant/pgvector)

Postgres + ベクトルDB

Neo4j

個別のiii-engineランタイム

デプロイメント

デフォルトでローカルファースト;共有/リモート用にDocker

クラウドAPIまたはセルフホスト

セルフホストまたはクラウド

クラウドまたはセルフホスト

ローカルファースト

検索モデル

ハイブリッド:FTS5 BM25完全一致レーン + セマンティック再ランク

ベクトル + グラフ + キーバリュー

ベクトルアーカイブストア + エージェント管理コアメモリ

時間的知識グラフ(事実有効期間ウィンドウ)

BM25 + ベクトル + グラフ (RRFフュージョン)

書き込みキャプチャ

接続されたエージェントからの明示的なツール呼び出し

明示的なadd()呼び出し(一部の統合は自動抽出)

エージェントが自身のメモリを自己編集

明示的なAPI呼び出し

フックベース、自動(明示的な呼び出し不要)

コード構造認識

バンドルされたコードグラフ + 概念グラフ、メモリと融合

組み込みなし

組み込みなし

組み込みなし

組み込みなし(別のプロジェクトとペアリング)

フレームワークロックイン

なし(任意のMCPクライアント)

なし

高い(Letta内で実行する必要あり)

なし

なし(任意のMCPクライアント)

免責事項と正確性: 競合他社の状況は急速に変化します。上記のマトリックスは、2026年第3四半期時点の、各システムの内部テストではなく、公開ドキュメントとREADMEに基づく中核的なアーキテクチャ特性を反映しています。代替フレームワークに関するデータポイントが変更された場合、または誤って表現されている場合は、Issueを開くか、テーブルを更新するためのプルリクエストを送信してください。ピアメンテナーからの修正を積極的に歓迎します。

HTTP & STDIO用MCPクライアントセットアップ

手動pipインストール

pip install marm-mcp-server

セットアップを選択するためのクイックルール

  • ローカルHTTP/STDIO = 最速のシングルマシンセットアップ。

  • Docker HTTP = 共有/常時稼働サーバー(キーが必要)。

  • Docker STDIO = プライベートなコンテナ化ローカル使用(HTTPキー不要)。

スウォーム/マルチエージェント注記: 書き込みキューはデフォルトで有効になっており、1つのワーカーを通じてメモリ書き込みをシリアライズします。共有HTTPデプロイメントの場合は、marm-memory start --profile swarm(200 RPM)または--profile swarm-max(600 RPM)を使用してください。--profile trustedは、プライベートデプロイメントのレート制限を完全に無効にします。STDIOは、プライベートなシングルエージェント/ローカル使用に最適です。完全な表については、スウォーム&マルチエージェントプリセットを参照してください。

「エージェント」とは、claude、gemini、grok、qwen、または任意のMCPクライアントを指します。CodexはMCPツールを追加するために--transportの代わりに--urlを使用します。

pip install marm-mcp-server
marm-memory start
# Stuck on client setup? Open a Q&A thread: https://github.com/Lyellr88/marm-memory/discussions
# most agents use this --transport command
"agent" mcp add --transport http marm-memory http://localhost:8001/mcp
codex mcp add marm-memory --url http://localhost:8001/mcp

デフォルトのpip/ローカル起動はゼロコンフィグです。MARMはlocalhostにバインドされ、SERVER_HOST=0.0.0.0で公開しない限りキーは必要ありません。

pip install marm-mcp-server
python -m marm_mcp_server.server_stdio
# most agents use this --transport command
"agent" mcp add --transport stdio marm-memory-stdio marm-mcp-stdio
codex mcp add marm-memory-stdio -- marm-mcp-stdio

virtualenvまたはパスベースのセットアップを使用する場合は、marm-mcp-stdiopython -m marm_mcp_server.server_stdioに置き換えてください。Claude Code、Cursor、VS Code、Qwen、Gemini CLIで動作します。STDIOは、ポートもAPIキーも必要としない単一のローカルプロセスのままで、HTTPと同じ14のツールを公開します。

複数のエージェントが1つのライブMARMサーバーを共有する必要がある場合は、HTTPを使用してください。STDIOは、各クライアントが独自のローカルプロセスを所有するため、プライベートなシングルエージェント使用に最適です。

# HTTP shared server, normal multi-agent use
marm-memory start --profile swarm

# HTTP shared server, heavier private swarm
marm-memory start --profile swarm-max

# HTTP trusted private lab/server, rate limiting disabled
marm-memory start --profile trusted

# STDIO remains keyless/private and does not use swarm flags
marm-mcp-stdio

Docker HTTPは、MARMをネットワークサーバーとして公開するためAPIキーが必要です。STDIOはクライアントプロセスに対してローカルに留まり、キーは必要ありません。

pipでMARMをインストールした場合、プロダクトCLIは同じセットアップを安全にプレビューまたは実行できます。デフォルトでループバックポートを使用し、~/.marmを保持し、生成されたキーをシェル履歴ではなく~/.marm/.envに保存し、既存のコンテナを置き換えることを拒否します。

marm-memory docker command                 # preview the exact HTTP command
marm-memory docker run                     # create the managed HTTP container
marm-memory docker stdio-command           # print a Docker STDIO client command
marm-memory docker status
marm-memory docker logs --follow
marm-memory docker stop

# Optional: mount repositories read-only for code indexing.
marm-memory docker run --repo /absolute/path/to/repository

# Optional: preview or explicitly write a Compose configuration.
marm-memory docker compose
marm-memory docker compose --yes

HTTPのruncommandcomposeコマンドは、同じ操作フラグを受け入れます:

フラグ

目的

--data-dir <絶対パス>

/home/marm/.marmにマウントされる永続的なホストディレクトリ。デフォルトは~/.marm。メモリ、インデックス、ログ、管理対象キーファイルを保持します。

--env-file <パス>

明示的なDocker envファイル。既にMARM_API_KEYを含んでいる必要があります。このフラグがない場合、MARMは~/.marm/.envを使用し、docker runまたはdocker compose --yesでキーが必要な場合にのみそこにキーを作成します。

--port <番号>

ホストHTTPポート。デフォルト:8001

--expose-network

ホストポートをループバックではなく0.0.0.0にバインドします。これは意図的なネットワーク公開です。ファイアウォールとTLSプロキシを設定してください。

`--profile standard

swarm

swarm-max

trusted`

ネイティブHTTP起動と同じ書き込みキューとレート制限プリセットを選択します。

--rate-limit-rpm <番号>

選択したプロファイルのHTTPレート制限を上書きします。0はレート制限を無効にします。

--repo <絶対パス>

コードインデックス作成用の繰り返し可能な読み取り専用リポジトリマウント。MARMは、コンテナ内でインデックスを作成するために、対応する各/workspace/repo-Nパスを報告します。

--tag <タグ>

公式イメージタグ。デフォルト:latest

--pull

新しいHTTPコンテナを作成する前に、選択したイメージをプルします。

--name <名前>

管理対象コンテナ名。MARMは、その名前の既存のコンテナを置き換えることを拒否します。

--memory <制限> / --cpus <制限>

オプションのDockerリソース制限。

--dry-run

docker runのみ:コンテナやキーファイルを作成せずに、計画されたコマンドを表示します。docker commandは常にプレビューです。

例えば:

# Shared local server with a custom data path and two repositories for indexing.
marm-memory docker command \
  --profile swarm \
  --data-dir /srv/marm-data \
  --repo /srv/projects/api \
  --repo /srv/projects/web

# Execute the reviewed command, pulling the image first.
marm-memory docker run --profile swarm --data-dir /srv/marm-data --pull

Docker STDIOはDocker HTTPとは別です:marm-memory docker stdio-commanddocker run -i --rmを使用し、ポートもベアラキーもありませんが、データディレクトリをマウントするため、短命なコンテナが終了してもSQLiteメモリは持続します。必要に応じて、そのコマンドで--data-dir--tagを使用してください。docker keydocker mountという別のコマンドはありません。--env-file--data-dirにより、生成されるHTTPコマンド内でそれらの選択が明示的になります。

marm-memory docker pullはイメージをダウンロードするだけです。marm-memory docker maintenance embeddings migrateは同じデータマウントに対して実行され、管理HTTPコンテナが実行中は拒否されます。このヘルパーはpipでインストールされたmarm-memoryコマンドでのみ利用可能です。Dockerのみのユーザーは以下の生のコマンドを使用できます。

# Step 1: generate key (do not add < > around the key)
docker run --rm lyellr88/marm-mcp-server:latest --generate-key

# Step 2: run server
docker pull lyellr88/marm-mcp-server:latest
docker run -d --name marm-mcp-server \
  -p 127.0.0.1:8001:8001 \
  -e SERVER_HOST=0.0.0.0 \
  -e MARM_API_KEY=your-generated-key \
  -v ~/.marm:/home/marm/.marm \
  lyellr88/marm-mcp-server:latest

# Step 3: connect client
"agent" mcp add --transport http marm-memory http://localhost:8001/mcp --header "Authorization: Bearer your-generated-key"

# PowerShell: set this before starting/restarting Codex
$env:MARM_API_KEY="your-generated-key"
codex mcp add marm-memory --url http://localhost:8001/mcp --bearer-token-env-var MARM_API_KEY

# Quick auth smoke test
curl -i -H "Authorization: Bearer $env:MARM_API_KEY" http://127.0.0.1:8001/mcp

--bearer-token-env-varは環境変数名を受け取り、生のキーは受け取りません。$env:MARM_API_KEYを設定した後、同じシェルからCodexを起動または再起動してください。ローカルのDockerスモークテストでは、MARM_API_KEY=testで問題なく、シェルのエスケープ問題を回避できます。実際のデプロイメントでは生成されたキーを使用してください。スモークテストのGET /mcpから406 Not Acceptableが返された場合、認証がMCPエンドポイントに到達したことを意味します。401 Unauthorizedはキーがないか不一致を意味します。

# --swarm: write queue on, 200 RPM - recommended for multi-agent shared servers
docker run -d --name marm-mcp-server \
  -p 127.0.0.1:8001:8001 \
  -e SERVER_HOST=0.0.0.0 \
  -e MARM_API_KEY=your-generated-key \
  -v ~/.marm:/home/marm/.marm \
  lyellr88/marm-mcp-server:latest --swarm

Dockerグラフツールはコンテナ内で実行されるため、docker runでホストパスをマウントしない限り、ホストパスを認識できません。

$env:MARM_API_KEY="test"

# The second -v line mounts your repo; adjust the host path to your project
docker run -d --name marm-mcp-server `
  -p 127.0.0.1:8001:8001 `
  -e SERVER_HOST=0.0.0.0 `
  -e MARM_API_KEY=$env:MARM_API_KEY `
  -v ~/.marm:/home/marm/.marm `
  -v C:\Users\lyell\Desktop\marm-memory:/workspace/marm-memory `
  lyellr88/marm-mcp-server:latest

次に、Windowsホストパスではなく、コンテナパスをインデックスします:

marm_graph_index(repo_path="/workspace/marm-memory")

グラフツールはコンテナパスを使用する必要があります。既に実行中のコンテナにマウントを追加することはできません。Dockerグラフインデックスが必要な場合は、リポジトリマウントを付けてコンテナを停止して再起動してください。

Docker STDIOには同じ組み込みのmarm-graphツールが含まれています。追加のイメージやインストール手順は不要です。

docker run --rm -i \
  -v ~/.marm:/home/marm/.marm \
  --entrypoint python \
  lyellr88/marm-mcp-server:latest \
  -m marm_mcp_server.server_stdio

  • Docker HTTPはキーが必要です。Docker STDIOは不要です。

  • 401が発生した場合、キーの一致と、環境変数変更後のクライアントの再起動を確認してください。

  • 完全なキーのセットアップ、ローテーション、トラブルシューティングについては:INSTALL-DOCKER.md

クライアントに接続する

サーバーを起動し(python -m marm_mcp_server)、次に以下のクライアントを接続します。すべてのブロックはデフォルトのローカルインストール(キーなし)を前提としています。Dockerまたは公開サーバーの場合は、各クライアントの折りたたみに表示されているAuthorization: Bearerヘッダーを追加してください。

claude mcp add --transport http marm-memory http://localhost:8001/mcp

Claude Codeはclaude mcp addを使用してHTTP、SSE、STDIOをサポートしています。MARMにはHTTPを使用してください。STDIOの場合:claude mcp add --transport stdio marm-memory-stdio marm-mcp-stdio

ワークスペースの.vscode/mcp.jsonに追加します。直接Pythonインストールにはmarm-memory-localを、Dockerまたは公開/キーモードにはmarm-memory-dockerを使用してください。

{
  "inputs": [
    {
      "type": "promptString",
      "id": "marm-api-key",
      "description": "MARM API Key for Docker or exposed server mode",
      "password": true
    }
  ],
  "servers": {
    "marm-memory-local": {
      "type": "http",
      "url": "http://localhost:8001/mcp"
    },
    "marm-memory-docker": {
      "type": "http",
      "url": "http://localhost:8001/mcp",
      "headers": {
        "Authorization": "Bearer ${input:marm-api-key}"
      }
    }
  }
}

.vscode/mcp.jsonを開き、目的のサーバーの上にあるStartをクリックし、その後Copilot AgentまたはVS CodeのネイティブMCPレジストリを利用する任意の拡張機能を使用してください。

ワークスペースの.cursor/mcp.jsonに追加します。CursorはVS Codeのserversルートではなく、mcpServersを使用します。

{
  "mcpServers": {
    "marm-memory-local": {
      "type": "http",
      "url": "http://localhost:8001/mcp"
    },
    "marm-memory-docker": {
      "type": "http",
      "url": "http://localhost:8001/mcp",
      "headers": {
        "Authorization": "Bearer ${env:MARM_API_KEY}"
      }
    }
  }
}

Docker/キーモードの場合は、環境変数MARM_API_KEYを設定してCursorを起動してください。

Codexはcodex mcp addまたは~/.codex/config.toml(Windowsでは%USERPROFILE%\.codex\config.toml)のTOML設定を使用します。

# Direct Python install - no key needed
codex mcp add marm-memory --url http://localhost:8001/mcp

# Docker or SERVER_HOST=0.0.0.0 - key required (set MARM_API_KEY in your shell first)
codex mcp add marm-memory --url http://localhost:8001/mcp --bearer-token-env-var MARM_API_KEY
[mcp_servers."marm-memory"]
url = "http://localhost:8001/mcp"
enabled = true
bearer_token_env_var = "MARM_API_KEY"
# Direct Python install - no key needed
gemini mcp add --transport http marm-memory http://localhost:8001/mcp

# Docker or SERVER_HOST=0.0.0.0 - key required
gemini mcp add --transport http marm-memory http://localhost:8001/mcp --header "Authorization: Bearer your-generated-key"

同等の~/.gemini/settings.json(ユーザースコープ)またはプロジェクトの.gemini/settings.json

{
  "mcpServers": {
    "marm-memory": {
      "httpUrl": "http://localhost:8001/mcp",
      "headers": {
        "Authorization": "Bearer your-generated-key"
      }
    }
  }
}
# Direct Python install - no key needed
qwen mcp add --transport http marm-memory http://localhost:8001/mcp

# Docker or SERVER_HOST=0.0.0.0 - key required
qwen mcp add --transport http marm-memory http://localhost:8001/mcp --header "Authorization: Bearer your-generated-key"

同等の.qwen/settings.json(プロジェクト)または~/.qwen/settings.json(ユーザー):

{
  "mcpServers": {
    "marm-memory": {
      "httpUrl": "http://localhost:8001/mcp",
      "headers": {
        "Authorization": "Bearer your-generated-key"
      }
    }
  }
}

xAIは自身のインフラから接続するため、localhostは機能しません。MARMをHTTPSで公開し、MARM_API_KEYを設定してください。

{
  "type": "mcp",
  "server_url": "https://your-marm-domain.example.com/mcp",
  "server_label": "marm-memory",
  "authorization": "Bearer your-generated-key"
}

完全なプラットフォームのウォークスルー、キー設定、OS固有の注意事項:Windows · macOS · Linux · Docker/キーモード · その他のプラットフォーム

掲載されていないクライアントをお使いですか? Issueを作成してお知らせください。クライアントアダプターはファーストクラスの機能リクエストです。

要件

  • Python:3.10以上

  • SQLite3:Pythonに含まれています(別途インストール不要)

  • ストレージ:初期セットアップで約100MB、メモリデータベースのサイズに応じて拡大します

  • RAM:最小512MB(同時クライアント数とデータベースサイズによって異なります)

  • OS:Windows、macOS、Linux

データの場所

  • 場所~/.marm/(Linux/macOS)または%USERPROFILE%\.marm\(Windows)

  • 内容:すべてのメモリ、セッション、ノートブックを含むSQLiteデータベース。コンセプトグラフは独自の~/.marm/index/データベースに存在します

  • バックアップ~/.marm/ディレクトリ全体をコピーしてすべてのデータを保存します

  • プライバシー:すべてのデータはお使いのマシンに留まり、クラウド同期や外部ストレージはありません

インストールの確認

最も高速なライブチェックとして、MCPサーバーのヘルスエンドポイントを使用します:

curl http://localhost:8001/health

期待される出力には、サーバーバージョン、機能の可用性(セマンティック検索ステータス)、データベース接続ステータス、サービスヘルスステータスが含まれます。

完全なMCPツールスイート(14ツール)

💡 プロのヒント: これらのツールを手動で呼び出す必要はありません!自然言語でAIエージェントにやりたいことを伝えるだけで、自動的に適切なツールが使用されます:

  • 「Claude、このセッションを'Project Alpha'として記録して、この会話を'データベース設計の議論'として追加して」

  • 「このコードスニペットを後で使えるようにノートブックに保存しておいて」

  • 「昨日の認証について話した内容を検索して」

AIエージェントは自動的に適切なツールを使用します。パワーユーザー向けに手動でのツールアクセスも可能です。

🧠 コアメモリ(7ツール)

ツール

機能

主要パラメータ

marm_smart_recall

互換性のあるグラフが存在する場合に、加法的で境界のある概念/コードグラフサイドカーを用いたハイブリッドメモリ検索

querylimitsession_namesearch_alldetail=1/2/3projectplatformexact_mode

marm_log_entry

構造化セッションログエントリを追加。各エントリはセマンティックメモリにも埋め込まれるため、marm_smart_recallで検索可能

entrysession_name

marm_log_show

フィルタリング機能付きで、すべてのエントリとセッションを表示

session_name

marm_delete

ログセッション、ログエントリ、またはノートブックエントリを削除

typetargetsession_nameprojectplatform

marm_summary

インテリジェントな切り詰め機能付きの、キャッシュされ貼り付け可能なセッションサマリー

session_name

marm_notebook

セッションスコープのスクラッチパッドと、永続的なグラフリンクドキュメントへの昇格

`action="add"

"use"

"show"

"status"

"clear"

"save"namedatasession_nameprojectplatform`

marm_compaction

レビュー可能な監査証跡付きのエージェント支援メモリクリーンアップ

`action="status"

"candidates"

"review"

"stage"

"apply"

"discard"`

🕸️ コードグラフ(5ツール)

ツール

機能

主要パラメータ

marm_graph_index

コード構造グラフへのリポジトリのインデックス作成、ステータス確認、プロジェクト一覧表示、自動再インデックスのオン/オフ切り替え

repo_pathprojectaction

marm_code_lookup

シンボル、テキストパターン、またはシンボルのソースを検索。grep/globの代わりに使用

`kind="auto"

"symbol"

"text"

"snippet"`

marm_graph_trace

関数からの呼び出しパスとデータフローをトレース

directionmode

marm_graph_architecture

アーキテクチャ概要:モジュール、ノード/エッジの内訳、スキーマ

project

marm_graph_impact

コード変更の影響範囲:git diff → 影響を受けるシンボル + リスク

sincebase_branchdepth

🧩 コンセプトグラフ(2ツール)

ツール

機能

主要パラメータ

marm_concept_build

グラフの再構築、または自動インデックス前に保存されたメモリのインデックス作成。新しいメモリは自動的にインデックスされる

session_nameproject、またはsearch_all=True(いずれか必須)

marm_concept_recall

エンティティ、リレーションシップ、リンクされたコードシンボルを明示的にクエリ

querydepth(1-5)、directionprojectplatform

14ツールすべてがHTTPとSTDIOの両方で利用可能です。ツールの表面下では、サーバーがライフサイクルセットアップ、プロトコルリフレッシュ、ドキュメントインデックス、日付コンテキスト、サマリーキャッシュメンテナンス、書き込みキュー処理、コンセプトインデックス、リポジトリ変更時のコード再インデックス、プロジェクト/プラットフォーム属性、ヘルスチェックを自動的に処理します。これらはエージェントのアテンションやトークンを消費しません。2つのグラフエンジンは最初の使用時に遅延起動し、起動に失敗しても7つのコアメモリツールをブロックすることはありません。メカニズムについてはアーキテクチャと内部構造を参照してください。

MARMの使用方法:ツールを呼び出さずに話す

MARMは内部でライフサイクル処理を行います。ドキュメントとセッション状態は最初の実際のツール呼び出し時に初期化され、パッケージ化されたドキュメントはソースファイルのハッシュ追跡付きでmarm_systemメモリ名前空間にインデックスされるため、エージェントはMARMの使用方法に関する質問にメモリ自体から回答できます。

サンプルワークフロー:クロスAI研究プロジェクト

MARMの実際の動作を示す現実的なワークフロー。**シナリオ:**複数のAIクライアントを使用して新しいプロジェクトの認証パターンを研究中。

フェーズ1:ルートセッション(Claude)

You: "Claude, create a MARM session called 'auth-research-2025-01'"
Claude calls: marm_log_entry(entry="Session: auth-research")
Result: Session routed to auth-research-[today]. MARM lifecycle/docs initialize automatically.

フェーズ 2: 調査の取得(Claude)

You: "Summarize OAuth2 vs JWT for API authentication and save it"
Claude calls: marm_log_entry(entry="Research: OAuth2 is token-based with refresh cycles, better for delegated access. JWT is stateless, good for microservices...", session_name="auth-research-2025-01")
Result: Research captured in the active session log and marked for summary-cache refresh

フェーズ 3: 再利用可能なリファレンスの追加(Claude)

You: "Save a JWT validation code snippet to my notebooks as 'jwt-validation-pattern'"
Claude calls: marm_notebook(action="add", name="jwt-validation-pattern", data="def verify_jwt(token):\n  # validation logic...")
Result: Reusable snippet stored for future projects

フェーズ 4: コンテキストの呼び出し(Gemini)

You: "Gemini, what authentication approaches did we research? Activate the JWT pattern."
Gemini calls: marm_smart_recall("authentication patterns", search_all=True)
Gemini calls: marm_notebook(action="use", names="jwt-validation-pattern")
Result: Gemini sees previous research + has JWT code available as context

フェーズ 5: 統合と要約(Qwen)

You: "Qwen, pull everything from the auth research and create a summary"
Qwen calls: marm_smart_recall("authentication", session_name="auth-research-2025-01", limit=20)
Qwen calls: marm_summary(session_name="auth-research-2025-01")
Result: Qwen generates an implementation guide from all captured research

フェーズ 6: セッションの終了(Claude)

You: "Log final decision - we're using JWT for APIs, and OAuth2 for user auth"
Claude calls: marm_log_entry(entry="DECISION: JWT for API auth, OAuth2 for user flows. Rationale: stateless APIs + delegated user access", session_name="auth-research-2025-01")
Result: Decision logged and searchable by all future AI clients

結果: 3つの異なるAIクライアントが協力してトピックを調査し、知見を共有し、判断を文書化しました。新しいAIごとにプロジェクトを説明し直す必要はありません。

高度なパターン

Project Structure:
├── project-name-planning/          # Initial design and requirements
├── project-name-development/       # Implementation details
├── project-name-testing/           # QA and debugging notes
├── project-name-deployment/        # Production deployment
└── project-name-retrospective/     # Lessons learned

ナレッジベースのループ:

  1. 取得: marm_log_entryを使用して構造化されたセッションの学習内容を記録

  2. 整理: 知識領域ごとにテーマ別セッションを作成

  3. 統合: 定期的なmarm_summaryで知識を統合

  4. 適用: 要約をmarm_notebook(action="add", ...)エントリに変換

マルチAIコラボレーション: 各AIは専用セッションで自分の強みを活かして作業し、marm_smart_recallを使用して他のAIの作業を基盤にし、コラボレーションセッションで知見を統合します。

  • セッションの命名: 相互参照のためにLLM名を含める

  • 戦略的なログ記録: 重要な判断、解決策、発見、設定に焦点を当てる

  • グローバル検索: search_all=Trueを使用して全セッションを横断検索

  • 自然言語検索: 「認証問題(JWTトークン)」は「auth error」よりも優れている

  • 階層的な呼び出し深度: detail=1は短い概要表示(約200文字)、detail=2はより大きなコンテキスト表示(約500文字)、detail=3は完全なメモリ内容

  • ノートブックの積み重ね: 複雑なワークフローに複数のエントリを組み合わせる

  • コンパクション: MARMにコンパクション候補を提示させ、marm_compactionを使用して要約をステージング、レビュー、適用、または破棄する

  • セッションのライフサイクル: 開始 → 作業 → 参照 → MARMが要求したときにステージングされたコンパクションをレビュー

MARMメモリの理解

2つの検索、2つのまったく異なる問題、1つのツール:

User: "I discussed machine learning algorithms yesterday"
MARM Search: Finds related memories about "ML models", "neural networks", "AI training"

User: "What was the COMPACTION_TRIGGER_COUNT setting?"
MARM Search: Finds the exact config memory even if the rest of the text differs

最初のクエリは意味に関するものなので、MARMはローカルベクトル埋め込みを使用して候補を再ランク付けします。これはホスト型ベクトルデータベースを使わないRAGスタイルのセマンティック検索です。2つ目は構文の形(設定キー)なので、MARMはそれを自動的に検出し、決定論的な完全一致にルーティングします。この正確な取得レーンが、デモでは機能するが、開発者が実際に尋ねる質問(設定キー、CLIフラグ、ファイルパス、API名、エラー文字列)に答えるメモリシステムとの違いです。純粋なセマンティックメモリシステムは、まさにそのようなクエリで失敗します。

MARMはフィルタ→再ランクのハイブリッド呼び出しに加えて、正確な取得レーンを使用します:

  1. 正確レーンexact_mode="auto"、デフォルト): 設定キー、CLIフラグ、ファイルパス、API/ツール名、ドット区切り名前空間、HTTPルート、URL、引用符で囲まれたコマンド文字列を検出し、決定論的なFTS5 BM25とLIKEフォールバックでルーティングします。埋め込みは使用されないため、結果は安定しておりリテラルです。

  2. フィルタ→再ランクレーン: 自然言語クエリはまずFTSインデックスから限定された候補セット(FTS_CANDIDATE_LIMIT、デフォルト200)を取得し、次にセマンティック埋め込みでそれらの候補を意味で再ランク付けします。保守的な時間的重み付けにより、一致がほぼ同じ場合に新しいメモリがわずかに優先されます。

  3. 限定セマンティックフォールバック: FTSのカバレッジが弱いか使用できない場合、MARMは限定されたセマンティックスキャン(RECALL_SCAN_LIMIT)にフォールバックします。応答にrecall_scan_truncated=trueが含まれている場合、フォールバックが上限に達したことを示します。セッション/クエリを絞り込むか、大規模ストアの場合は環境変数を引き上げてください。

  4. チャンク対応スコアリング: 長いメモリ(約180語以上)は内部的に重複するチャンク行として埋め込まれ、呼び出し時には最良一致チャンクを使用してチャンクスコアを1つの親メモリにまとめます。再ランクレーンとフォールバックレーンの両方がチャンク対応です。

これが、ストアが成長しても呼び出しレイテンシがほぼ一定に保たれる理由です(ベンチマークを参照)。セマンティック再ランクは常に限定されたセットをスコアリングし、すべての埋め込みをスキャンすることはありません。

正確呼び出しの制御: exact_mode="auto"が通常は適切です。RECALL_SCAN_LIMIT--generate-keysettings.pyなどのリテラルテキストと一致する必要があるクエリにはexact_mode="exact"を使用します。構文のように見えるクエリを意味ベースの呼び出しとして扱う必要がある場合は、exact_mode="semantic"を使用します。

メモリの種類と分類

  1. コンテキストログ - 自動分類された会話メモリ

  2. 手動エントリ - 明示的に保存された重要な情報

  3. ノートブックエントリ - 再利用可能な指示と知識

  4. セッション要約 - 圧縮された会話履歴

MARMは書き込み時にコンテンツを自動的に分類します: コード(プログラミングスニペットと技術的議論)、プロジェクト(作業の会話と計画)、書籍(文学、学習教材、研究)、一般(その他すべて)。

プロジェクトとプラットフォームの属性

MARMはメモリ、ログエントリ、ノートブックエントリにNULL可能なproject列とplatform列を保存します。プロジェクトは作業ディレクトリから、プラットフォームは接続クライアント(Claude Code、VS Code、Cursorなど)から検出されます。MARM_PROJECTMARM_PLATFORMは検出を上書きします。marm_smart_recall(project=..., platform=...)はデフォルトのフィルタリングなしの動作を変更せずに呼び出しをスコープするため、1つの共有サーバーで複数のプロジェクトを相互汚染なく保持できます。

ナレッジグラフ: コードと概念

MARMにはメモリストアを補完する2つのグラフシステムが組み込まれています。リポジトリの構造を理解するコードグラフと、保存されたメモリの内容を理解する概念グラフです。同じプロジェクトに対して両方がインデックスされると、概念エンティティはコードシンボルに相互リンクします。

コードグラフ: リポジトリのインデックス作成とコード検索

marm-graphは両方のトランスポートにバンドルされています。リポジトリを一度インデックス化し、エージェントがファイルを繰り返しスキャンすることなくコード構造に関する質問をできるようにします:

Use marm_graph_index to index this repository.
Then use marm_code_lookup when you need symbols, files, or source snippets.
Use marm_graph_trace for call paths, marm_graph_architecture for an overview, and marm_graph_impact for change-risk checks.

推奨されるエージェントワークフロー: 一度インデックス化し、その後、広範なファイル読み取りの前にmarm_code_lookupを、呼び出し元/呼び出し先やデータフローのコンテキストが重要な場合にmarm_graph_traceを、方向性のためにmarm_graph_architectureを、リスクのあるリファクタリングの前にmarm_graph_impactを使用します。1つのグラフクエリで数十のgrep/readサイクルを置き換えることができ、これがトークン節約の源です。

リポジトリがインデックス化されると、MARMは自動的に最新の状態に保ちます。バックグラウンドポーラーがリポジトリの変更を検出し、再インデックス化するため、コミット後に手動で再インデックスする必要はありません。未コミットの作業がある間は、既に変更されたファイルへの繰り返し編集を安価にチェックできないため、毎サイクル更新されます。代わりにリクエスト時のみインデックス化するには:

marm-mcp-server projects auto off

エージェントもmarm_graph_index(action="auto_off")で同じことができ、action="auto_status"で何が監視されていて各プロジェクトが最後にいつインデックス化されたかを報告します。この切り替えは再起動後も持続し、GRAPH_AUTO_INDEX環境変数を上書きします。

内部では、エンジンはcodebase-memory-mcp(MIT)です。これはゼロ依存の静的バイナリで、tree-sitterを通じて158言語を解析し、主要言語にはHybrid LSP型解決を備え、平均的なリポジトリを数秒でインデックス化し、シンボル検索とコールトレースを1秒未満で応答します。MARMが保持する永続接続上の149,107ノードのグラフで測定: シンボル検索146ms、コールトレース67ms、完全なアーキテクチャ概要は1.23秒(これはサブ秒ではない唯一のクエリです)。MARMは特定のリリースを固定し、起動時にツールスキーマを検証し、アップストリームのツールセットを5つのフォーカスされたMCPツールにルーティングして、モデル表面を小さく保ちます。グラフバックエンドは最初のグラフツール使用時に遅延起動するため、メモリ、ロギング、ノートブック、要約ツールは引き続き高速に起動します。Dockerでは、エンジンバイナリはイメージに組み込まれています。ローカルのpipインストールでは、最初のグラフ使用時にダウンロードされます(約269MB、1回限り)。

縮退モード: グラフエンジンの起動に失敗した場合(初回実行時のダウンロードにネットワークがない、ディスク容量不足、スキーマのずれ)またはGRAPH_ENABLED=falseが設定されている場合、グラフツールは{"status": "error", "message": "graph backend unavailable"}を返しますが、他の9つのツールは正常に動作し続けます。グラフの障害がメモリをダウンさせることは決してありません。

概念グラフ: メモリの内容

MARMは保存したメモリからナレッジグラフを抽出し、型付きエンティティ(概念、決定、パターン、エラー、ツール、人物、組織)を型付き関係(修正する、実装する、依存する、使用する、原因となる、置き換える、拡張する)で接続します。これは自動的に行われます。メモリを保存するとキューに入れられ、バックグラウンドワーカーが約30秒後にグラフに追加します。marm_concept_buildは引き続き完全またはスコープ付きの再構築に使用できます。グラフができたら、marm_smart_recallは一次メモリのランキングを変更せずに、限定された関連エンティティ、関係、リンクされたコードをgraph_contextサイドカーとして追加します。marm_concept_recallは明示的なグラフ探索のために引き続き利用可能です:

marm_concept_recall(query="write queue")            → the entity, its relationships, linked code symbols
marm_concept_recall(query="related to SQLite", depth=3) → multi-hop traversal of everything connected

使用方法:

  • デフォルトで自動化:新しい記憶はツール呼び出しなしでグラフに到達します。CONCEPT_AUTO_INDEX=falseに設定すると手動ビルドのみに戻り、ワーカーは停止しますがキュー行の記録は続けるため、再度有効にするとオフ中に書き込まれたすべてのデータを取得します。CONCEPT_INDEX_DEBOUNCE_SECONDS(30)とCONCEPT_INDEX_BATCH_SIZE(20)でペースを制御します。

  • 両方のトランスポートで安全に同時使用:メモリデータベース内のリースロックにより、あるプロセスでの再構築中に別のプロセスがグラフテーブルに書き込むのを防ぎます。グラフがビジー状態であることを検出したビルドは、衝突せずにその旨を報告します。

  • 障害は記憶に影響を与えません:インデックス作成は書き込みパスの外部にある永続キュー上で実行されます。抽出の問題は再試行され、繰り返し失敗する記憶はエラーとともに保留され、その記憶自体は通常通り保存および呼び出しされます。

  • バックログの解消には呼び出し速度の低下が伴います:エンティティ抽出はCPUバウンドであるため、ワーカーがキューを処理している間、実際の768メモリコーパスでは測定された呼び出し時間の中央値が約8msから約16msに増加します。書き込みは影響を受けません。これはバックログが処理されている間のみ適用され、ほとんどの人にとってはアップグレード後の再構築時の一度だけです。scripts/benchmarking/performance/bench_concept_worker.py --from-liveで再現できます。

  • バックログのためにビルドするsession_nameproject、またはsearch_all=Trueにスコープされたmarm_concept_buildは、自動インデックス作成が存在する前に保存された記憶をインデックス化し、必要なアップグレード後の再構築を実行します。

  • これまでに2回のアップグレードが必要:プラットフォーム帰属前、または要約の代わりに圧縮ソースがインデックス行になった前に構築されたグラフは、marm_concept_build(search_all=True)が必要です。完全ビルドは派生概念データベースのみをバックアップしてリセットします。ターゲットビルドはプラットフォームの所有権を推測しません。

  • スコープ全体をページング処理:ビルドはスコープ内のすべてのメモリを読み取ります。CONCEPT_BUILD_ROW_CAP(デフォルト500)がページサイズであり、これを小さくすると、ビルドは残りをスキップするのではなく、より多くの小さなページを読み取ります。

  • 圧縮されたセッション:元の記憶はインデックス化され、生成された要約はインデックス化されないため、概念は実際に述べられた場所に帰属したままになります。

  • 呼び出しはフェイルオープン:概念グラフが欠落、空、非互換、または利用不可の場合でも、通常のメモリ呼び出しがブロックされることはありません。応答ではグラフのステータスが個別に報告されます。

  • コード相互リンク:コードグラフが同じプロジェクトをインデックス化している場合、コードシンボルと一致する概念エンティティがリンクされ、「何を決定したか」と「コード内のどこにあるか」が接続されます。

  • バンドルされた抽出ランタイム:spaCyランタイムと英語抽出モデルはMARMに同梱されていますが、最初の抽出時にのみロードされます。この最初の抽出は、ビルドを実行したときではなく、最初のメモリが保存された直後に自動的に行われます。インストールの破損や不完全によりこれらが利用できない場合、両方の概念ツールは正常に機能を低下させますが、コアメモリは引き続き利用可能です。marm-memory knowledge statusを実行し、必要に応じてMARMを再インストールしてください。

  • 分離されたストレージ:概念グラフは独自のSQLiteデータベース(~/.marm/index/marm_index.db)と独自のコネクションプールに存在するため、概念グラフへの書き込みが本番メモリデータベースをブロックしたり破損したりすることはありません。

  • コンソールアトラス:MARMコンソールは、最大750エンティティと6,000の保存済み関係を含む完全なアトラスをレンダリングします。より大きなグラフでは、最大600エンティティと4,000の集約された視覚的エッジからなる決定論的な接続サンプルが使用され、サンプルであることが明確に表示されます。

これにより、フラットなメモリ検索では対応できないクロスセッション構造のギャップが埋まります。セッションはメモリを整理しますが、概念グラフはメモリを接続するため、「書き込みキューに依存しているものは何か?」という質問に、3つの異なるエージェントからの5つのセッションにまたがる場合でも回答できるようになります。

アーキテクチャと内部構造

上記のすべては、少数の意図的に設計されたメカニズム上で動作します。このセクションは完全なマップであるため、あなた(またはあなたのエージェント)はサーバーが何を行っているかを推測する必要がありません。

ストレージエンジン

  • WALモードのSQLite~/.marm/marm_memory.dbにあり、コネクションプール(5接続)を使用します。WALにより、書き込み中でもリーダーがブロックされません。これは、複数のエージェントが書き込み中に1つが呼び出す場合に重要です。

  • FTS5全文検索インデックスmemories_fts)は、メモリテーブル上の外部コンテンツテーブルとして維持され、正確なレーン(BM25)とハイブリッド呼び出しのフィルタリング段階の両方を支えます。

  • チャンクストレージ:約180語を超えるメモリは、memory_chunksテーブル内の重複する150トークンのチャンク(50トークンの重複)に分割され、それぞれが独自の埋め込みを持ちます。呼び出しはチャンクをスコアリングし、親メモリに統合します。

  • 埋め込みは、fastembedベースのjinaai/jina-embeddings-v2-small-enエンコーダーを使用します。33Mパラメータ、512次元、8,192トークンのコンテキストウィンドウ、Apache-2.0ライセンスです。個別のクエリ/ドキュメントテキストプレフィックスは必要ありません。エンコーダーは最初のセマンティック使用時に遅延ロードされ、ロックの背後でシリアル化されるため、同時エンコードが互いに破損することはありません。利用できない場合でも、書き込みは成功します。メモリはロードされるまで埋め込みなしで保存されます。セマンティックスコアリングは、Pythonループではなく、単一のNumPyバッチ(行列コサイン)として実行されます。

  • 概念グラフは独自のデータベース~/.marm/index/marm_index.db)と独自のプールを持ち、同じプール実装を再利用しますが、メモリストアと接続を共有することはありません。意図的な分離です。実験的なグラフビルドが本番WALを停止させてはなりません。唯一の例外はインデックスキューで、これは意図的にメモリデータベース内に存在し、メモリとそのインデックスタスクが一緒にコミットされるようにします。グラフ自体は派生可能で使い捨て可能なままです。

書き込みパス

  • シリアル化された書き込みキュー(デフォルトで有効):すべてのメモリ書き込みは1つの内部非同期ワーカーを通じて流れ、マルチエージェント負荷下でのSQLiteライター競合を排除します。キューは汎用的であり、圧縮適用も同じワーカーを通過するため、サブシステムに関係なく、正確に1つのライターが存在します。MAX_QUEUE_SIZEで制限されます。

  • 書き込み時の統合(オプトイン、CONSOLIDATION_ENABLED=1)は、メモリが保存される前に2つのレイヤーを実行します。

    • レイヤー1、完全一致重複排除:正規化されたコンテンツのSHA-256ハッシュがセッション内でチェックされます。ハッシュヒットは、重複排除の前に実際のコンテンツに対して検証されるため、ハッシュ衝突が発生しても、異なるコンテンツが自動的にマージされることなく、新しい行が保存されます。

    • レイヤー2、セマンティックマージCONSOLIDATION_THRESHOLDコサイン類似度以上のニアデュプリケートは蓄積されるのではなくマージされます。これは書き込みをブロックすることはありません。エンコーダーが利用できない場合、書き込みは統合されずに続行されます。

    • このトレードオフは測定され公開されています。書き込みコストの中央値が約9倍(6.5ms対58ms)になる代わりに、ストアをクリーンに保ちます。これは、メモリワークロードでは読み取りが支配的だからです。上記のベンチマークのセクション3を参照してください。

  • 概念インデックス作成は永続的なアウトボックスです。書き込みはメモリと同じトランザクションでインデックスタスクを記録するため、タスクなしでメモリが存在することはありません。バックグラウンドワーカーがそのキューを消費し、概念グラフを書き込みます。書き込みパスで抽出を待つものはなく、抽出中にプロセスが強制終了されても、タスクはインメモリジョブではなく行であるため、作業が失われることはありません。両方のトランスポートがワーカーを実行するため、2つはインメモリデータベース内のリースロックを介して調整します。これはプロセス内ロックでは両方にまたがることができません。

  • 圧縮(オプトイン、COMPACTION_ENABLED=1)はレイヤー3です。セッション内の十分な書き込み後、バックグラウンドパスがコサイン類似度とUnion-Find連結成分を使用して関連メモリのクラスターを検出します。最小クラスターサイズ、最小経過時間、および進行中の作業を圧縮しないためのアクティブセッション猶予期間によってゲート制御されます。次にMARMは、接続されたエージェントに各クラスターの要約を依頼する、バインドされたリクエストを注入します。candidatesstagereviewapply または discard。適用時にソースメモリIDが保持されるため、圧縮された要約は元のメモリにトレース可能なままです。ステージングされた要約は期限切れになり(COMPACTION_STAGING_TTL_HOURS)、ナッジは上限とクールダウン制限があり、注入にはバイト予算があります。この設計は、LLMが何のためにあるのかについて正直です。MARMが検出し、エージェントが要約し、人間がレビュー可能なstage/apply/discardループが破壊的なステップをゲート制御します。

呼び出しパス

Understanding MARM Memoryで説明されています。正確なレーン(FTS5 BM25 + LIKEフォールバック)、フィルター→再ランク付け(境界のあるFTS候補 → バッチセマンティック再ランク付け → 時間的ブレンド)、境界のあるセマンティックフォールバックと明示的な切り捨てフラグ、およびチャンク統合スコアリング。呼び出しの詳細度(detail=1/2/3)は、各メモリの返される量を制御し、すべてのMCP応答は、プロトコルを壊す代わりにインテリジェントにコンテンツを切り詰める1MB応答制限機能を通過します。

コードグラフサブプロセスプロトコル

バンドルされたグラフエンジンは、インポートではなく、管理された子プロセスとして実行されます。

  • トランスポート:子プロセスのstdioを介した改行区切りJSON-RPC 2.0。検証済みのハンドシェイク(initialize → サーバーバージョンのキャプチャ → initialized通知)を行います。

  • エンベロープの注意:応答は、インデックス0を想定するのではなく、最初のJSON解析可能なコンテンツ項目をスキャンします。これは、上流のバイナリが更新通知を先頭に追加する可能性があるためです。ツールエラーはJSON-RPCエラーではなくresult.isErrorとして到着し、上流の独自の修正ヒントが添付されたクリーンな{"status": "error"}辞書に変換されます。

  • シリアル化:1つのロックが単一のstdinパイプ上の各書き込み+読み取りラウンドトリップを保護します。非同期呼び出し元はasyncio.to_threadを通過するため、イベントループがサブプロセスI/Oでブロックされることはありません。

  • クラッシュリカバリ:stderrはバックグラウンドスレッドでドレインされ、子プロセスのEOF/クラッシュが検出され、次の呼び出しでプロセスが透過的に再生成されます。タイムアウトは意図的にクラッシュとして扱われません。長時間のインデックス実行がまだ進行中である可能性があり、強制終了すると進行中の作業が破壊されます。

  • 監視:レイジーシングルトン監督者がプロセスライフタイムのクライアントを所有します。起動は、最初のグラフツール呼び出し、またはエンジンバイナリがすでにダウンロードされている場合は自動インデックスポーラーによってトリガーされ、MCPレイヤーに例外を発生させることはなく、固定バイナリのツールスキーマを検証するため、上流のドリフトが呼び出し中ではなく起動時にキャッチされます。

  • 自動再インデックス作成はgit署名でポーリングされ、ファイルシステム監視ではありません。バックグラウンドタスクが各インデックス化されたリポジトリのHEADとダーティ状態を比較します。これはエンジン外でgitを実行して計算されるため、アイドルチェックにエンジンロックは不要です。コミットは再インデックスをトリガーします。ツリーがダーティな間は、リポジトリはサイクルごとに再インデックスされます。これは、git statusがどのファイルが変更されたかを報告し、その内容を報告しないため、すでに変更された1つのファイルへの繰り返しの編集は、より安価なフィンガープリントでは区別できないバイト同一の出力を生成するためです。Gitはcore.fsmonitorを無効にし、スクラブされた環境で実行されます。この設定は、監視対象リポジトリからタイマーで実行されるプログラムに名前を付けるためです。

  • すべてのストア変更のための1つのゲート:3つのサーフェスすべてでの手動インデックス、ポーラー、およびプロジェクトの削除はすべて、メモリデータベース内の単一のリース行を通過します。HTTPとSTDIOは別々のプロセスであり、1つの共有エンジンストア上で別々のエンジン子プロセスを持ちます。そのため、プロセス内ロックでは両方にまたがることができません。リースは、呼び出し元が待機を停止したときではなく、エンジン呼び出しが実際に戻ったときに解放されます。キャンセルされたリクエストは、エンジンがまだ書き込み中であるにもかかわらず、ストアを別のプロセスに渡すことはできません。

セキュリティとレート制限

  • 2モード認証ゲート:ループバック(127.0.0.1)ではキーレス、サーバーがネットワーク公開されると(SERVER_HOST=0.0.0.0、Docker)、MARM_API_KEY(Bearer)が必須になります。--generate-keyでキーを生成します。デフォルトで安全、ローカルではゼロのセットアップ手間。

  • IPベースのレート制限:スライディングウィンドウと一時的なブロックを使用し、設定の迷路ではなくCLIプリセット(下の表)で調整します。

  • ローカルファースト:すべては~/.marm/の下にあります。クラウド同期、テレメトリ、外部ストレージはありません。

  • グレースフルシャットダウン:SIGTERM/SIGINTハンドラーはコネクションプールを適切にドレインして閉じます。内部イベントシステムは、コールバックごとのエラー分離とタイムアウトを使用して自動化コールバックを実行するため、1つの不良フックがサーバーをハングアップさせることはありません。

Swarm & マルチエージェントプリセット

フラグ

レート制限

書き込みキュー

使用する状況

(なし)

80 RPM

有効

通常のローカル使用、3~5エージェントの小規模設定

--swarm

200 RPM

有効

共有HTTPサーバー、書き込みスタイルにもよるが約15~30エージェント

--swarm-max

600 RPM

有効

より負荷の高いローカル/プライベートスウォーム、書き込みスタイルにもよるが約50~100エージェント

--trusted

無効

有効

プライベート/信頼できるデプロイメントのみ

--rate-limit-rpm N

N RPM

変更なし

カスタムオーバーライド、0で制限無効化

書き込みキューはプリセットに関係なくメモリ書き込みを直列化します。swarmフラグはその上でHTTPレート制限を調整します。キューは書き込み順序を制御し、統合とコンパクションは別のメモリメンテナンス層です。このスタック(WAL + プーリング + 1つの直列化ライター + RPMプリセット)は意図的に「SQLite、多数のエージェント、1台のマシン」に範囲を限定しており、分散マルチノードメモリは現在の設計の範囲外です。

自己メンテナンス型ドキュメント

パッケージ化されたドキュメントは起動時に marm_system メモリ名前空間にインデックス化され、50回のツール呼び出しごとにリフレッシュされます。ソースファイルのハッシュ追跡により、変更のないドキュメントはスキップされ、変更または削除された行は再インデックス化されます。接続されたエージェントは、あなたがドキュメントを貼り付ける代わりに、marm_smart_recall を使ってMARMの使用方法の質問に答えることができます。

設定リファレンス

変数

デフォルト値

制御内容

SERVER_HOST

127.0.0.1

バインドアドレス; 0.0.0.0 はサーバーを公開し、MARM_API_KEY を必須にします

SERVER_PORT

8001

HTTPポート

MARM_API_KEY

(空)

ネットワーク公開デプロイメント用のBearerキー

MARM_DB_PATH

~/.marm/marm_memory.db

メモリデータベースの場所

MARM_CONCEPT_DB_PATH

~/.marm/index/marm_index.db

概念グラフデータベースの場所

MARM_PROJECT / MARM_PLATFORM

(自動検出)

プロジェクト/プラットフォームの属性を上書き

MARM_RATE_LIMIT_RPM

80

IPごとの1分あたりのリクエスト数(プリセットで上書き可能)

WRITE_QUEUE_ENABLED

1

1つのワーカーで書き込みを直列化

FTS_CANDIDATE_LIMIT

200

セマンティック再ランク付け前に取得するBM25候補数; キーワードの重複が弱いストアでは増やし、最も近いキーワード一致に結果を絞るには減らす

RECALL_SCAN_LIMIT

10000

セマンティックフォールバックスキャンの上限; レスポンス内の recall_scan_truncated=true はこれがヒットしたことを意味する

FTS_QUERY_MODE

or_nostop

セマンティックリコールがキーワードクエリを構築する方法: or_nostop はフィラーワードを無視して残りの任意の用語に一致、or は任意の用語に一致、and はすべての用語を必要とする(2.31.0以前の動作)。正確/語彙レーンは常にすべての用語を必要とする。

FTS_EXTRA_STOPWORDS

(空)

キーワードクエリ構築時に無視する追加の単語(カンマ区切り)。ストア内で非常に一般的でシグナルを持たない用語向け

HYBRID_SEARCH_TEXT_WEIGHT

0.05

キーワードスコアがランキングに与える影響度。ベンチマークスイープから設定; 精度は 0.04-0.08 でピークに達し、0.10 を超えると急激に低下。0.0 では、キーワードマッチングは考慮されるメモリを絞り込むが、並べ替えは行わない。

FTS_LONE_HIT_SCORE

1.0

1つのメモリのみが一致する場合、またはすべての一致が同点の場合に使用されるキーワードスコア。小さなストアでは、単一のキーワード一致が完全一致とみなされるべきでない場合に下げる。

SEMANTIC_SEARCH_ENABLED

1

0 に設定すると埋め込みモデルなしで実行: 何もロードされず、埋め込みも書き込まれず、リコールはキーワードマッチングにフォールバック。低メモリホストで有用、またはモデルが利用不可の場合のリコールの動作を確認するのに有用。marm-memory doctor はオフの場合に報告する。

TEMPORAL_WEIGHT / TEMPORAL_HALF_LIFE_DAYS

0.1 / 30

最近性ブーストの強さと減衰

CONSOLIDATION_ENABLED

0

書き込み時の重複排除 + セマンティックマージ

CONSOLIDATION_THRESHOLD

0.92

ニアデュプリケートをマージするために必要なコサイン類似度。ブレンドされたランキングスコアではなく、意味類似度のみと比較

COMPACTION_ENABLED

0

バックグラウンドクラスター検出 + エージェント支援によるコンパクション

COMPACTION_TRIGGER_COUNT

5

コンパクションパス前のセッションあたりの書き込み数

COMPACTION_SIMILARITY_THRESHOLD / COMPACTION_MIN_CLUSTER_SIZE / COMPACTION_MIN_AGE_HOURS

0.88 / 3 / 24

クラスター検出のゲート

COMPACTION_STAGING_TTL_HOURS

168

ステージングされたサマリーが期限切れになるまでの待機時間

GRAPH_ENABLED

true

5つのコードグラフツールのキルスイッチ

GRAPH_AUTO_INDEX

true

コードグラフに既にあるリポジトリの自動再インデックス。projects auto off または marm_graph_index(action="auto_off") からの保存されたスイッチがこれを上書きするため、ここで設定した値ではユーザーがオフにしたものを再有効化できない

GRAPH_AUTO_INDEX_INTERVAL

30

リポジトリごとのgit署名チェック間の秒数。最小5

GRAPH_AUTO_INDEX_FULL_INTERVAL

300

gitリポジトリではないディレクトリの再インデックス間の秒数。安価な変更チェックが存在しない場合。最小60

GRAPH_AUTO_INDEX_MODE

moderate

自動再インデックスのインデックス深度: fullmoderate、または fast。それ以外は警告してフォールバック

GRAPH_AUTO_INDEX_LEASE_SECONDS

120

何も更新していない場合にインデックスゲートが所有されたままになる時間。実行中のインデックスは自身のリースを更新するため、これは強制終了されたプロセスがインデックスをブロックする時間の上限であり、インデックスにかかる時間の上限ではない

GRAPH_AUTO_INDEX_PROJECT_TTL

300

監視対象プロジェクトのリストがエンジンから再読み取りされるまで信頼される時間

CONCEPT_BUILD_ROW_CAP

500

概念グラフ構築中に1ページあたりに読み取られるメモリ行数。構築の上限ではない: スコープ内のすべてのメモリはどちらにせよ読み取られる

CONCEPT_AUTO_INDEX

true

新しいメモリの自動概念インデックス。false0no、または off はワーカーを停止し、ビルドを手動にする。書き込みはどちらにせよキュー行を記録する

CONCEPT_INDEX_DEBOUNCE_SECONDS

30

書き込み後、インデックス開始前の静穏期間。バーストが1回のパスになるようにする

CONCEPT_INDEX_BATCH_SIZE

20

バッチあたりのインデックスメモリ数、上限500。減らしても競合は減らず、測定ではわずかに悪化

CONCEPT_INDEX_BATCH_PAUSE_MS

250

バックログをクリアする際のバッチ間の一時停止。インデックス中の最悪ケースのリコールを約270msから約80msに削減し、ドレイン時間は約18%延長。0 で無効

CONCEPT_INDEX_LEASE_SECONDS

300

要求されたインデックスタスクが何も更新していない場合に所有されたままになる時間。進行中の作業は自身のリースを更新するため、これは強制終了されたプロセスがタスクを保持する時間の上限であり、バッチにかかる時間の上限ではない。再利用されたタスクは試行回数を消費しない

CONCEPT_INDEX_MAX_ATTEMPTS

3

メモリが再試行されずにエラーで停止されるまでの失敗試行回数

トラブルシューティング

Jina v2 Small のデフォルトは512次元の埋め込みを使用します。古い all-MiniLM-L6-v2 のデータは384次元であり、再埋め込みが必要です。すべてのMARM HTTPプロセスとSTDIOプロセスを停止し、次のコマンドを実行します。

marm-memory maintenance embeddings migrate

これにより、メモリ、チャンク、および既存の概念グラフベクトル(ノートブックのスクラッチエントリは埋め込みを持たなくなります)が再埋め込みされ、進行状況が報告され、両方のデータベースが検証され、中断後も再開可能です。動作中のHTTPサーバーに対しては起動を拒否します。STDIOプロセスは確実に検出できないため、手動で停止する必要があります。

チャンク化されたメモリの修復

500ワードを超えるメモリは、より小さなチャンクとしても保存されます。チャンクサイズはバージョン間で変更されており、上記の移行ではチャンクを再分割せずに再埋め込みを行うため、古いチャンクは古い境界を保持します。すべてのMARMプロセスを停止し、次のコマンドを実行します。

marm-memory maintenance chunks rechunk

これにより、古いチャンクが再分割され、中断された書き込みで失われたチャンクが補完され、現在のしきい値を下回ったメモリからのチャンクが削除されます。既に正しいメモリはエンコーダを読み込まずにスキップされるため、再実行してもコストはかかりません。上記と同じ動作中のサーバーガードがあり、保存されたベクトルが設定された埋め込みモデルと一致しない場合は拒否します。その場合はまず移行を行ってください。この処理がなくてもリコールは機能しますが、長いメモリでは精度が低くなります。

サーバーが起動しない

  • Pythonのバージョンを確認: python --version(3.10以上である必要があります)

  • ポート8001が使用中でないことを確認: lsof -i :8001(macOS/Linux)または netstat -ano | findstr :8001(Windows)

  • ホームディレクトリの権限エラーを確認(~/.marm/ が読み取り/書き込み可能である必要があります)

  • プラットフォーム固有のトラブルシューティングを参照: INSTALL-DOCKER.mdINSTALL-WINDOWS.mdINSTALL-MACOS.mdINSTALL-LINUX.md

STDIO接続が失敗する

  • pipインストール後、marm-mcp-stdio がPATHに存在することを確認: marm-mcp-stdio --help

  • または、次を使用: python -m marm_mcp_server.server_stdio

  • STDIOトランスポートの要件についてAIクライアントのドキュメントを確認

  • 直接実行してエラーメッセージを確認: python -m marm_mcp_server.server_stdio

AIクライアントがMARMに接続できない

  • curl http://localhost:8001/health でサーバーが実行中であることを確認

  • ファイアウォールがポート8001をブロックしていないことを確認

  • STDIOの場合: marm-mcp-stdio(コンソールスクリプト)または python -m marm_mcp_server.server_stdio を使用

  • サーバーとAIクライアントの両方を再起動

ツールがAIクライアントに表示されない

  • HTTPモードを curl http://localhost:8001/health で確認

  • サーバーログで初期化エラーを確認

  • AIクライアントを切断して再接続し、ツールリストを更新

  • HTTPとSTDIOの両方で14のツールが公開されます: 7つのコアメモリ/ログ/ノートブック/圧縮ツール、5つのバンドルコードグラフツール、2つの概念グラフツール

グラフツールが「グラフバックエンドが利用できません」を返す

  • GRAPH_ENABLEDfalse に設定されていないことを確認(HTTPとSTDIOの両方に影響します。グラフツールは両方のトランスポートで完全に同等です)

  • 最初のグラフ使用は、固定コードベースメモリエンジンの起動またはローカルダウンロードに時間がかかる場合があります

  • Dockerでは、グラフエンジンバイナリはイメージに組み込まれています。ローカルのpipインストールでは、最初のグラフ使用時にフェッチされる場合があります

  • グラフの起動に失敗しても、コアメモリツールは引き続き動作します

概念ツールが「entities_extracted: 0」を返す

  • まず、スコープ指定された概念構築に、抽出可能なエンティティを持つメモリが実際に含まれていることを確認してください。

  • marm-memory knowledge status を実行します。ランタイムまたはモデルがないと報告された場合は、python -m pip install -U --force-reinstall marm-mcp-server でインストールを修復します。

新しいメモリがグラフに表示されない

  • marm-memory knowledge status を実行します。index_queue.pending は待機中のメモリ数、index_queue.parked は諦めたメモリ数です。auto_index: false はインデックスがオフになっていることを意味します。

  • デバウンス間隔(デフォルト30秒)と抽出時間を考慮してください。書き込みのバーストは、メモリごとではなく、1回のパスとしてインデックスされます。

  • CONCEPT_AUTO_INDEXfalse0nooff に設定されていないことを確認してください。

  • 再構築待ちのグラフはインデックスされません。コンソールまたは marm-memory knowledge statusrebuild_required と報告した場合は、marm_concept_build(search_all=True) を1回実行してください。その後、キューに入れられたメモリが取得されます。

  • 自動インデックスは、アップグレード以降に書き込まれたメモリのみをカバーします。より古いものをすべて取り込むには、1回ビルドを実行してください。

  • 抽出に3回失敗したメモリは、永久に再試行されるのではなく、パークされます。その理由はタスクとともに記録されます。

コードの変更がコードグラフに表示されない

  • marm-memory projects auto status を実行します。enabled: false は自動再インデックスがオフになっていることを意味します。source: override は、環境ではなく保存されたスイッチがオフにしたことを意味します。

  • リポジトリは監視される前に一度インデックスされる必要があります。marm-memory projects list で登録済みのものが表示されます。

  • インターバル(デフォルト30秒)とインデックス時間を考慮してください。コミットは次のチェックで取得されます。

  • コンソールから削除されたプロジェクトは意図的に抑制されたままになります。そのため、古いウォッチリストから再作成されることはありません。明示的にインデックスすると再登録されます。

  • 自動インデックスにはグラフエンジンが必要であり、グラフエンジンはバイナリがダウンロードされるまで休止状態のままです。グラフツールの呼び出しは1回でダウンロードを行います。

インデックスが index_in_progress を返す

  • 別のMARMプロセスがインデックスゲートを保持しています。通常は、他のトランスポートのポーラーまたはコンソールのインデックスジョブです。プロジェクトの削除でも同じことが報告されます。これは、インデックス中の削除が元に戻されるためです。しばらくしてから再度実行してください。

ビルドが build_in_progress を返す

  • 別のMARMプロセスがグラフを書き込み中です。通常は、他のトランスポートのインデックスワーカーです。完全な再ビルドでない限り、ビルドは短時間です。しばらくしてから再度実行してください。

ビルドが lock_lost を返す

  • ビルドが長時間停滞し、別のプロセスがグラフを引き継いだため、途中で停止しました。中断したマシンやデバッガーの一時停止が原因であることが多いです。停止前にインデックスされたものは保持され、ビルドを再実行すると残りが完了します。

メモリが保存されない

  • ~/.marm/ ディレクトリが存在し、書き込み権限があることを確認

  • 利用可能なディスク容量を確認

  • 簡単なメモリでテスト: AIに1行を保存させ、marm_log_show で確認

  • HTTPモードの場合、curl http://localhost:8001/health でサーバーの状態を確認

検索が結果を返さない

  • メモリが存在することを確認: marm_log_show でエントリを一覧表示

  • すべてのセッションを検索するには search_all=True を使用

  • より単純で一般的な検索クエリを試す

  • 数秒待つ。最初のセマンティック検索はMLモデルを読み込みます

メモリが表示されたり消えたりする

  • MARMが再起動またはクラッシュしたかどうかを確認(データは ~/.marm/ に永続化されます)

  • ディスク容量が不足していないか確認

  • システムログでデータベースエラーを確認

データの損失または破損

  • すぐにサーバーを停止

  • ~/.marm/ ディレクトリにバックアップコピーがあるか確認(作成した場合)

  • バックアップから復元: バックアップの ~/.marm/ をホームディレクトリにコピーして戻す

  • サーバーを再起動

データベースロックエラー

  • すべてのAIクライアント接続を閉じる

  • サーバーを停止: Ctrl+C

  • データベースディレクトリ全体をバックアップ: cp -r ~/.marm ~/.marm.backup

  • データベースを保持しているプロセスを確認: lsof ~/.marm/marm_memory.db(macOS/Linux)またはタスクマネージャー(Windows)

  • ロックを保持しているプロセスがあれば終了

  • データベースの整合性を確認: sqlite3 ~/.marm/marm_memory.db "PRAGMA integrity_check;"

  • 整合性チェックが失敗した場合、バックアップから復元

  • 整合性チェックが成功した場合、ロックは解除されているはずです。サーバーを再起動

検索結果が遅い

  • 最初の検索は遅くなります(モデルがディスクから読み込まれます)。以降の検索は高速です

  • 大規模なデータベース(1000件以上のメモリ)では数秒かかる場合があります

  • 検索を制限: 無制限の結果ではなく limit=10 を使用

  • marm_summary を使用して古いセッションを圧縮

サーバーがメモリを消費しすぎる

  • エントリの多いノートブックは蓄積される可能性があります。marm_notebook(action="clear") を使用してアクティブなエントリを整理

  • 未使用のAIクライアント接続を閉じる

  • 圧縮が有効な場合、marm_compaction(action="review") を使用してステージングされた圧縮サマリーを検査

エラー

原因

解決策

address already in use

ポート8001が占有されている

ポート8001のプロセスを強制終了するか、別のポートを使用する

permission denied: ~/.marm/

データベースディレクトリに書き込み権限がない

chmod 755 ~/.marm/ または所有者を確認

module not found: core.memory

依存関係が不足している

marm-mcp-server/ から再インストール: pip install -e ".[dev]"

database is locked

複数のプロセスがDBにアクセスしている

他の接続を閉じ、サーバーを再起動

embedding model not found

セマンティック検索モデルがダウンロードされなかった

初回実行には時間がかかります。しばらく待ち、インターネット接続を確認

メモリの動作、トランスポート、サポートされているクライアント、圧縮、バックアップに関する質問については、FAQを参照してください。

スター履歴

コントリビューション

MARMはあらゆるレベルのコントリビューターを歓迎します。コードは役立ちますが、ドキュメント、セットアップノート、クライアントテスト、バグ報告、ベンチマーク、そして毎日AIツールを使用している人々からの実際のワークフローフィードバックも同様に重要です。

貢献に適した場所:

  • より多くのMCPクライアント、IDEエージェント、オペレーティングシステムでMARMをテストする

  • ドキュメント、スクリーンショット、例、プラットフォーム固有のセットアップノートを改善する

  • 明確な再現手順を含むバグやわかりにくいインストール手順を報告する

  • 実際の使用から得たメモリワークフロー、エージェントの習慣、ツールのアイデアを共有する

  • 公開されているissuesを確認する

💡 このリストにあなたの名前を載せたいですか?CONTRIBUTING.mdガイドをチェックして始めましょう!

MARMコミュニティに参加する

AIメモリの未来を共に築きましょう - コーディングは不要です!

接続: MARM Discord | GitHub Discussions

ライセンスと使用に関する注意事項

Copyright © 2026 Ryan A. Lyell. MARMはApache 2.0ライセンスの下で公開されています(著作権表示についてはNOTICEを参照)。フォーク、実験、統合を歓迎します。MARMはまた、MITライセンスのcodebase-memory-mcpなどのサードパーティのオープンソースコンポーネントをラップしています。帰属についてはTHIRD_PARTY_NOTICES.mdを参照してください。これを基に構築する場合は、非公式バージョンが公式MARMリポジトリから公開されているリリースと容易に区別できるようにし、ユーザーが何をインストールしているか分かるようにしてください。

プロジェクトドキュメント

使用ガイド

  • README.md - このファイル: 完全な使用ガイド、ツールリファレンス、ワークフロー、アーキテクチャ

  • PROTOCOL.md - MCP動作プロトコル

  • FAQ.md - MARMの使用に関するよくある質問への回答

MCPサーバーインストール

プロジェクト情報

Available Tools

14 tools
marm_code_lookupA
🔎 Find code: symbols/definitions, text patterns, or a symbol's source.

Use INSTEAD OF grep/glob. `kind=auto` picks: a qualified_name reads source;
otherwise it searches the graph by name/keyword. Set `kind=text` to grep code,
`kind=snippet` to read a symbol's source, `kind=symbol` to force graph search.

Parameters:
- query: symbol name, natural-language phrase, code/text pattern, or a qualified_name
- project: project name; omit to auto-resolve
- kind: auto | symbol | text | snippet (default auto)
- regex: for text search, treat query as a regex (default False)
- file_pattern: glob to scope search, e.g. "*.py" (optional)
- limit: max results, 1-200 (default 20)

Returns: graph lookup response, or a graph-unavailable error if the graph
backend is disabled or failed to start
ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoauto
limitNo
queryYes
regexNo
projectNo
file_patternNo

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description carries the full burden. It discloses that the tool returns a 'graph lookup response, or a graph-unavailable error if the graph backend is disabled or failed to start.' It also explains the behavior of kind=auto based on query type. However, it does not detail the structure of the response or mention any authentication or rate limits, which would improve transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with an emoji, bolded key terms, a concise overview, and a bulleted parameter list. Every sentence adds value, and the length is appropriate for the complexity of the tool. It is front-loaded with the most important information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description effectively explains the tool's functionality and parameters, and it mentions the return type. Given the complexity (6 parameters, no output schema, no annotations, and many sibling tools), it is largely complete. However, it could briefly mention what a 'graph lookup response' contains or provide an example to further aid understanding.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds significant meaning beyond the input schema. For each parameter, it explains its purpose and behavior: e.g., query can be 'symbol name, natural-language phrase, code/text pattern, or a qualified_name'; kind options are detailed; regex is for text search; project can be omitted for auto-resolve; file_pattern is a glob. With 0% schema coverage, the description fully compensates.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Find code: symbols/definitions, text patterns, or a symbol's source.' It distinguishes itself by saying 'Use INSTEAD OF grep/glob,' and explains the different modes (auto, symbol, text, snippet), making it easy to understand what the tool does and how it differs from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use this tool and its alternatives: 'Use INSTEAD OF grep/glob.' It also explains the behavior of each kind value, e.g., 'kind=auto picks: a qualified_name reads source; otherwise it searches the graph by name/keyword. Set kind=text to grep code, kind=snippet to read a symbol's source, kind=symbol to force graph search.' This gives clear context for selecting the appropriate mode.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

marm_compactionA
Compact related memories into a single summary to reduce context bloat.

Workflow: status/candidates → stage → review → apply/discard

action="status"     — check if compaction candidates exist (run first)
action="candidates" — get pending candidates with source previews; each includes a ready-to-use prompt
action="stage"      — submit your summary: {candidate_id, suggested_summary}; source_memory_ids optional
action="review"     — inspect staged summaries before committing
action="apply"      — commit a staged summary; source memories are marked compacted
action="discard"    — reject a staged summary without touching source memories
ParametersJSON Schema
NameRequiredDescriptionDefault
actionYes
summariesNo
candidate_idNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses key behaviors: apply marks source memories as compacted, discard leaves source memories untouched, and candidates include a 'ready-to-use prompt.' This is meaningful contextual information beyond the schema, though it does not mention all side effects or error conditions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured: a one-sentence purpose, a workflow arrow, and a bulleted action list. Every sentence provides useful information without redundancy or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has complexity (six actions, multiple parameters) and no output schema, so the description should clarify return values and expected behavior for each action. The workflow is explained, but the response/return format for actions like status or candidates is not described, leaving the user guessing about what data comes back. This is a significant omission for a stateful workflow.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explains action values (status, candidates, stage, etc.) and the candidate_id parameter in context. However, the summaries parameter is never explicitly described, leaving ambiguity about its structure and usage (likely for batch apply, but not stated). This is a noticeable gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence states the tool's exact purpose: 'Compact related memories into a single summary to reduce context bloat.' The verb (compact) and resource (memories) are clear, and the workflow action list distinguishes it from sibling tools like marm_log or marm_smart_recall.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a clear workflow (status/candidates → stage → review → apply/discard) and tells the user to run status first. It gives context for each action but does not explicitly name alternative tools or state when not to use this tool, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

marm_concept_buildA
🕸️ Extract entities/relationships from memory content into the concept graph.

Scope with session_name or project for a targeted build, or pass
search_all=True for everything (row-capped). Links extracted entities to
marm-graph code symbols when available. Call this before marm_concept_recall
— there's no data until a build has run at least once.

Parameters:
- session_name: scope extraction to this session; omit with search_all=True
- search_all: extract across all sessions, row-capped (default False)
- project: scope extraction to this project (optional)
- run_id: optional Console build-run ID for status polling

Returns: entities_extracted, relationships_created, code_links_created, duration_ms
ParametersJSON Schema
NameRequiredDescriptionDefault
run_idNo
projectNo
search_allNo
session_nameNo

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Describes extraction of entities/relationships, code linking, row-capping for search_all, and return fields. Lacks details on overwrite/durability behavior, but overall informative for a build tool with no annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise and well-structured with bullet-like parameter list and clear action verb. The emoji is non-essential but not harmful. Could be slightly tighter by removing redundant phrasing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, manually lists return values. Covers scoping options, linking behavior, and prerequisite ordering. Missing error conditions and permissions, but adequate for a build tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but description compensates fully by explaining the purpose and interaction of all four parameters (session_name, search_all, project, run_id) beyond their titles.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the action (extract entities/relationships) and the resource (concept graph). Distinguishes from sibling marm_concept_recall by specifying the ordering dependency.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly explains scoping via session_name/project or search_all=True, and advises calling this before marm_concept_recall, providing clear when-to-use and when-not-to guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

marm_concept_recallA
🔎 Search the concept graph: entities, their relationships, and linked code.

Query as a bare concept name for a lookup, or phrase it as "related to X"
to emphasize traversal — both route from query shape alone. Returns empty
lists (not an error) when marm_concept_build hasn't run yet or marm-graph
has no matching code symbols.

Parameters:
- query: concept name, or a "related to X" style ask
- session_name: scope to this session; omit to search across all (optional)
- limit: max entities/relationships returned, 1-100 (default 10)
- depth: max hop distance to traverse, 1-5 (default 1 = direct neighbors only)
- direction: outgoing | incoming | both (default both)
- project: scope to this project; entities with the same name in
  different projects are distinct nodes; omit to search across all (optional)
- platform: scope to this client/platform; omit to search across all (optional)

Returns: entities, related_entities, linked_code
ParametersJSON Schema
NameRequiredDescriptionDefault
depthNo
limitNo
queryYes
projectNo
platformNo
directionNoboth
session_nameNo

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations were provided, so the description must carry the full burden. It discloses that returns empty lists (not errors) when the graph hasn't been built or no matches exist, which sets correct expectations. It does not explicitly state read-only behavior, but that is implied from the search nature. This is adequate but could be improved.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a brief paragraph followed by bullet points for parameters. It uses formatting (emoji, bold) to aid readability. While it could be slightly more concise, it doesn't waste words and every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 7 parameters and no output schema, the description explains inputs well but the return structure is only briefly mentioned ('Returns: entities, related_entities, linked_code') without further detail on the shape or content. This is a gap, but the tool's purpose is still understandable. It meets minimum viability.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema coverage is 0%, so the description must fully explain parameters. It does so for all 7 parameters: each has a clear purpose, default values, and acceptable ranges (e.g., limit 1-100, depth 1-5, direction enum). It adds meaning beyond the schema, which only defines types and defaults.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool searches the concept graph for entities, relationships, and linked code. It uses a specific verb (search, query) and resource (concept graph). However, it does not explicitly distinguish this tool from siblings like marm_smart_recall or marm_graph_trace, leaving ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides guidance on query styles ('bare concept name' vs 'related to X'), which helps with when to use each. However, it lacks explicit advice on when to choose this tool over siblings (e.g., vs marm_smart_recall for smarter retrieval, or marm_graph_trace for tracing). No exclusions or alternatives are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

marm_deleteA
🗑️ Delete a log session, log entry, or notebook entry

type="log" + session_name: delete specific entry by id or topic
type="log" (no session_name): delete entire session and all its entries
type="notebook": delete notebook entry by name
ParametersJSON Schema
NameRequiredDescriptionDefault
typeYes
targetYes
projectNo
platformNo
session_nameNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description adequately discloses the destructive behavior and scope of deletion. It explains what gets deleted based on parameter combinations, but does not mention irreversibility or cascading effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description uses bullet points and emojis, which improves readability but adds length. It is clear but slightly verbose for the information conveyed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a delete tool, the description provides sufficient context about what can be deleted and how. However, missing details on the 'target' parameter and no output schema reduce completeness slightly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description clarifies the interaction between 'type' and 'session_name' parameters, but does not explain the 'target', 'project', or 'platform' parameters. With 0% schema coverage, the description partially compensates but leaves gaps.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states that the tool deletes log sessions, log entries, or notebook entries. It distinguishes between different deletion behaviors based on the 'type' and 'session_name' parameters, making the purpose clear and specific.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear patterns for when to use each variation: deleting a specific log entry, deleting an entire log session, or deleting a notebook entry. It implicitly guides the agent to use other tools for non-deletion operations, but does not explicitly mention alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

marm_graph_architectureA
🏛️ High-level architecture overview: node/edge breakdown, modules, and schema.

One-shot orientation for a project — the de-facto module clusters, package
structure, and the graph schema (node labels + properties) folded in.

Parameters:
- project: project name; omit to auto-resolve

Returns: graph architecture response, or a graph-unavailable error if the
graph backend is disabled or failed to start
ParametersJSON Schema
NameRequiredDescriptionDefault
projectNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses the failure mode: 'graph-unavailable error if the graph backend is disabled or failed to start', and also notes that omitting the project parameter auto-resolves. This gives the agent useful expectations for both success and error cases.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Compact and well-organized: purpose in the first line, a clarifying sentence, then a parameter list and a returns line. Uses whitespace effectively and has no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers input, output (graph architecture response), and failure mode (graph-unavailable error). Without an output schema, it doesn't detail the response structure, but for an orientation tool this is a minor gap; the description is sufficient for basic invocation and expectation setting.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema only defines a nullable string with a default. The description adds critical meaning: 'project name; omit to auto-resolve' clarifies the parameter's purpose and the behavior when omitted, which is far beyond the schema's minimal info.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States 'High-level architecture overview: node/edge breakdown, modules, and schema' – a specific verb+resource combination that clearly distinguishes this from sibling tools like graph_trace or graph_impact. The noun phrase 'architecture overview' leaves no ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly frames itself as 'one-shot orientation for a project', implying use when a high-level understanding is needed. It doesn't explicitly name alternatives, but the context of sibling tools plus the 'orientation' wording makes the intended use case clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

marm_graph_impactA
💥 Blast radius of code changes: git diff → affected symbols + risk.

Pass `since` (a git ref/date) or a `base_branch` to compare against. Returns
which symbols a change touches and how far the impact propagates.

Parameters:
- project: project name; omit to auto-resolve
- since: git ref or date to compare from, e.g. HEAD~5, v0.5.0 (optional)
- base_branch: base branch to diff against (default "main")
- depth: impact propagation depth, 1-5 (default 2)

Returns: graph impact response, or a graph-unavailable error if the graph
backend is disabled or failed to start
ParametersJSON Schema
NameRequiredDescriptionDefault
depthNo
sinceNo
projectNo
base_branchNomain

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It usefully mentions the 'graph-unavailable error if the graph backend is disabled or failed to start' and describes the output conceptually. However, it does not explicitly state whether the operation is read-only, whether any mutation occurs, or any authentication requirements, leaving some ambiguity.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with a bold purpose statement, followed by usage, a bulleted parameter list, and return value. Every sentence earns its place, and the structure is clean and scannable. There is no redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Since there is no output schema, the description explains returns: 'graph impact response, or a graph-unavailable error.' It also clarifies in the opening that the response includes affected symbols and propagation distance. This covers the essentials, though a more structured breakdown of the response object would make it more complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage, so the description must compensate. It does so thoroughly by listing all four parameters with meanings and examples: 'since: git ref or date to compare from, e.g. HEAD~5, v0.5.0', 'depth: impact propagation depth, 1-5', and defaults for base_branch and project. This adds significant semantic value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening line 'Blast radius of code changes: git diff → affected symbols + risk' precisely states the tool's function with a specific verb and resource. It clearly distinguishes from sibling tools like marm_graph_trace (trace specific symbols) and marm_graph_architecture (architecture view) by focusing on impact propagation from a git diff.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear usage context: 'Pass `since` (a git ref/date) or a `base_branch` to compare against' and explains defaults for base_branch and depth. However, it does not explicitly name alternative tools or state when not to use this tool, relying on the purpose to differentiate from siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

marm_graph_indexA
🕸️ Index a code repository into the graph, or check status / list known projects.

Pass `repo_path` to index a repo (returns the project name to use in every
other tool). Omit it to list indexed projects, or pass `project` to check
index status. Call this first — all other graph tools need an indexed project.

Indexed repos are re-indexed automatically in the background. Use
`action="auto_off"` to stop that, `auto_on` to resume, `auto_status` to check.

Parameters:
- repo_path: path to the repository to index; omit to list/status only
- project: existing project name for a status check; omit to auto-resolve
- mode: index depth — full | moderate | fast (default moderate)
- action: auto | index | status | list (default auto; infers from repo_path
  presence), or auto_on | auto_off | auto_status to control automatic
  re-indexing

Returns: graph index/status/list response, or a graph-unavailable error if the
graph backend is disabled or failed to start
ParametersJSON Schema
NameRequiredDescriptionDefault
modeNomoderate
actionNoauto
projectNo
repo_pathNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully carries the behavioral disclosure burden. It reveals auto-reindexing ('Indexed repos are re-indexed automatically in the background'), the effects of action options, and the possible graph-unavailable error on backend failure. It does not cover permissions or side effects on the repo, but covers the core behaviors well.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is structured with a summary, parameter list, and return note. It front-loads the main purpose and stays under 200 words, but includes an unnecessary emoji and slightly redundant phrasing. Still, every section earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (4 optional params, multiple actions, auto-reindexing), the description covers the purpose, parameter semantics, usage order, and return/error behavior. It lacks concrete examples or response shape, but no output schema exists, so the description is sufficiently complete for an agent to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It does by providing per-parameter explanations: repo_path as index vs list/status, project as status check, mode as depth, and action as explicit enum with inference rules. This adds substantial meaning beyond titles and enums.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear verb+resource statement: 'Index a code repository into the graph, or check status / list known projects.' It also differentiates itself from sibling graph tools by explicitly stating 'Call this first — all other graph tools need an indexed project,' establishing it as the prerequisite setup tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear usage context: 'Call this first' and explains when to pass vs omit repo_path and project. It outlines the three main action modes (index, status, list) and the auto-reindexing controls, but does not explicitly name alternative tools for other graph operations, relying on the prerequisite statement to imply exclusion.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

marm_graph_traceA
🧭 Trace call paths / data flow through the graph from a function.

`direction=inbound` finds callers, `outbound` finds callees, `both` for all.
`mode=data_flow` follows value propagation. `cross_service` attempts HTTP/async
boundaries but does not currently join a client call to its server handler, so
treat an empty result as unknown rather than as "nothing calls this".
Use for impact analysis, dependency tracing, "who calls this".

Parameters:
- function_name: function or method to trace from
- project: project name; omit to auto-resolve
- direction: inbound | outbound | both (default both)
- depth: max hops, 1-5 (default 3)
- mode: calls | data_flow | cross_service (default calls)
- risk_labels: add CRITICAL/HIGH/MEDIUM/LOW risk tiers by hop distance (default True)
- include_tests: also return callers in test files (default False)
- include_evidence: per-hop `strategy` (lsp | language_rule | heuristic | unresolved)
  and `confidence`, so a guessed edge is distinguishable from a resolved one
  (default True). Test callers typically come back heuristic at low confidence

Returns: graph trace response, or a graph-unavailable error if the graph
backend is disabled or failed to start
ParametersJSON Schema
NameRequiredDescriptionDefault
modeNocalls
depthNo
projectNo
directionNoboth
risk_labelsNo
function_nameYes
include_testsNo
include_evidenceNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden and does so well. It discloses the cross_service limitation that an empty result means 'unknown' and defines evidence strategies and confidence levels so guessed edges are transparently distinguishable. Error behavior for an unavailable graph backend is also explicitly documented.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The prepended emoji and short purpose line front-load the key operation. Parameters are grouped in a compact bullet-style list, and each sentence adds either setup, a limitation, or parameter behavior. It is information-dense without being bloated for a tool with 8 parameters.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is thorough for a complex tool with no output schema or annotations: it covers behavioral caveats, direction/mode choices, evidence semantics, and backend failure. The main gap is that the return value is only described as a generic 'graph trace response', and it doesn't define the result graph shape or edge fields. Still, this is quite complete for an agent's invocation needs.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage, but the tool description covers all 8 parameters with meaningful semantics. It adds constraints like depth 1-5, auto-resolution for project, direction/mode meanings, risk-label behavior, and evidence strategy values. This fully compensates for the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with a specific action: 'Trace call paths / data flow through the graph from a function,' which clearly identifies the tool's purpose. It also lists concrete use cases ('impact analysis, dependency tracing, who calls this') that help orient an agent. The only slight overlap with the sibling marm_graph_impact is minor because this tool centers on graph traversal from a function.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives actionable direction/mode guidance (inbound vs outbound vs data_flow vs cross_service) and states 'Use for impact analysis, dependency tracing, who calls this.' However, it doesn't explicitly state when not to use it, nor name alternatives like marm_graph_impact, marm_code_lookup, or marm_graph_architecture. Clear context exists, but exclusion/alternative guidance is missing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

marm_log_entryA
📝 Write a log entry to the active session.

Entries are stored with a date, topic, and summary. If `entry` begins with
"Session: [name]" or "Topic: [name]", the active session switches to that name
and all subsequent entries route there automatically. Entries are also stored
as semantic memories so marm_smart_recall can find them.

Entry format: YYYY-MM-DD-topic-summary (date prefix is optional; auto-tagged if omitted)

Parameters:
- entry: the text to log; plain text or prefixed with "Session:" / "Topic:" to switch sessions
- session_name: override the target session explicitly (optional; active session used if omitted)

Returns: status, message confirming the entry or session switch, entry_id, memory_id
ParametersJSON Schema
NameRequiredDescriptionDefault
entryYes
session_nameNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden. It discloses key behaviors: entries are stored with date/topic/summary, session switching via prefix, auto-tagging of date, and storage as semantic memories for recall. It also notes return values.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is somewhat lengthy but well-structured with bullet points and clear sections. Every sentence adds value, and the purpose is front-loaded. It could be slightly more concise, but it effectively communicates necessary details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema and low schema coverage, the description fully compensates by explaining return values, complex session-switching behavior, and storage side-effects. It is complete enough for an AI agent to use correctly without additional references.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must fully define parameters. It explains that 'entry' is the text to log with optional prefixes for session/topic switching, and 'session_name' is an optional override. This adds significant meaning beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool writes a log entry to the active session, specifying the resource (log entry, active session) and verb (write). It distinguishes from siblings like marm_log_show (read) and marm_smart_recall (recall), which have different verbs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use the tool (to write a log entry) and gives detailed formatting and session-switching rules. However, it does not explicitly state when not to use it or mention alternatives, though the context from sibling names implies this.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

marm_log_showA
📋 List log sessions or show entries for a specific session.

Two modes depending on whether `session_name` is provided:
- No session_name: returns a summary of all sessions with entry counts
- With session_name: returns all entries for that session, ordered by date descending

Parameters:
- session_name: name of the session to inspect (omit to list all sessions)

Returns (no session_name): status, sessions list with session_name/entry_count, total_sessions
Returns (with session_name): status, session_name, entries list with id/entry_date/topic/summary/full_entry, total_entries
ParametersJSON Schema
NameRequiredDescriptionDefault
session_nameNo

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so description carries full burden. Describes two modes and return structures. However, does not disclose if the operation is read-only, or any potential side effects. Since it's a log viewer, likely safe, but not explicitly stated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is well-structured with bullet points and clear sections. Every sentence adds value without redundancy. Efficiently covers purpose, modes, parameters, and return formats.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 1 parameter, no output schema, and no annotations, the description fully covers both modes, parameter behavior, and expected return structure. No gaps in essential information.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter (`session_name`) with schema coverage 0%. Description fully explains that it's optional and its effect on output. Provides more semantic meaning than the schema alone, which only has type and default.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it lists log sessions or shows entries for a specific session. Distinguishes two modes based on `session_name` presence. Action verb 'list' and 'show' combined with resource 'log sessions/entries' make purpose concrete.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains which mode triggers when `session_name` is provided or omitted. Provides explicit context for each usage. Does not explicitly exclude scenarios or compare to sibling tools, but the guidance is clear and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

marm_notebookA
📔 Unified notebook — add, use, show, status, clear, or save

action="add": save or update a scratch entry (name + data required)
action="use": activate entries as instructions (names required, comma-separated)
action="show": list scratch entries for this session with previews
action="status": show currently active entries
action="clear": clear the active entry list
action="save": promote a scratch entry (or new data) into the permanent docs store
ParametersJSON Schema
NameRequiredDescriptionDefault
dataNo
nameNo
namesNo
actionYes
projectNo
platformNo
session_nameNomain

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden of behavioral disclosure. It does describe side effects: updating scratch entries, activating instructions, clearing the active list, and promoting to permanent docs. But it omits important behaviors like whether 'clear' also deletes scratch entries, whether 'save' removes the source entry, and session persistence semantics. This is partial transparency, not full.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is exceptionally well-structured: a single-line summary followed by a bulleted list of actions, each one sentence. There is no fluff, and the format makes the multi-action tool easy to scan and understand quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has 7 parameters, multiple actions, no annotations, and no output schema, yet the description only explains a subset of actions and three of the seven parameters. It lacks the underlying conceptual model (scratch vs. active vs. permanent) and never mentions return values or session-specific behaviors. This is insufficient for an agent to fully anticipate tool behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds meaning for action, name, data, and names by specifying their required status per action (e.g., 'name + data required' for add). However, it completely ignores project, platform, and session_name, which are present in the schema with zero documentation. Since schema coverage is 0%, the incomplete parameter guidance creates a significant gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as a unified notebook manager with six explicit verbs (add, use, show, status, clear, save). It distinguishes this from sibling tools like marm_log_entry or marm_smart_recall by framing it as a scratch/active entry management tool, making its purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Per-action instructions imply when to use each subcommand (e.g., 'add' for saving scratch entries, 'use' for activating instructions), and the 'notebook' context implies a general use case. However, it never explicitly contrasts with alternatives or states when not to use this tool, and there is no high-level guidance on sibling tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

marm_smart_recallA
🧠 Recall memories by semantic similarity or keyword match.

Searches stored memories for the most relevant matches to `query`.
Returns a ranked list of results with similarity scores. When a compatible
concept graph exists, the response also includes bounded relationship and
linked-code context without changing memory ranking.

Parameters:
- query: natural language search term or phrase
- session_name: limit search to a specific session (default searches active session)
- limit: maximum number of results to return (default 5)
- search_all: if True, search across all sessions instead of just the active one
- include_logs: if True, include log entries alongside memory results
- detail: controls how much content is returned per result
    1 = summary only (~200 chars)
    2 = extended context (~500 chars)
    3 = full content
- exact_mode: retrieval lane to use
    'auto'     = automatically switch to exact/lexical for syntax-heavy queries
                 (config keys, file paths, CLI commands, API names, code snippets)
    'exact'    = always use deterministic FTS/BM25, no semantic re-ranking
    'semantic' = always use vector similarity regardless of query shape
- project: filter results to a specific project (e.g. "marm-memory"); omit to search all
- platform: filter results to a specific platform (e.g. "claude-code", "cursor"); omit to search all

Returns: status, ranked results, graph_context, and results_count
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
detailNo
projectNo
platformNo
exact_modeNoauto
search_allNo
include_logsNo
session_nameNodefault

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It discloses read-like behavior (search, return ranked results, graph context) but omits details like error handling, performance characteristics, or any destructive potential. Adequate but not thorough.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with a concise header, summary paragraph, and clear parameter list. Every sentence adds value without redundancy. Uses formatting (emojis, line breaks) for readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 9 parameters, no annotations, and no output schema, the description covers purpose, all parameters, and return fields (status, ranked results, graph_context, results_count). Missing details on result structure or graph_context, but largely complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but the description provides detailed explanations for all 9 parameters, including enumeration for 'exact_mode' and implications for 'detail' levels. This adds significant meaning beyond the raw schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the tool recalls memories by semantic similarity or keyword match, with a clear verb (searches/recalls) and resource (memories). It distinguishes from siblings like marm_concept_recall by mentioning similarity scores and graph context, but does not explicitly compare.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus siblings. It describes what it does but does not state when NOT to use it or provide alternatives for specific use cases like exact matching or code lookup.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

marm_summaryA
📊 Generate paste-ready context block for new chats

Reads log_entries for the session and returns a formatted markdown summary.
Equivalent to /summary: [session name] command
ParametersJSON Schema
NameRequiredDescriptionDefault
session_nameYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It states it reads log_entries and returns a markdown summary, suggesting a read-only operation. However, it does not disclose potential side effects, prerequisites (e.g., session existence), or limits (e.g., entry count). Adequate but not detailed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise: a clear headline sentence, a brief explanation, and a command equivalence. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (single param, read-only), the description covers the core purpose and output format (markdown). It could mention if it only reads from the provided session or has size limits, but overall it is fairly complete for a straightforward tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage, so the description must add meaning. It mentions 'Equivalent to /summary: [session name] command', which hints that session_name is the session's name. This provides some context beyond the bare schema, but still lacks format details or examples.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool generates a 'paste-ready context block for new chats' by reading log entries and returning a formatted markdown summary. This distinguishes it from siblings like marm_log_show (raw logs) and marm_log_entry (adding entries).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage by equating to a /summary command, indicating it should be used to get a compact summary. However, it does not explicitly state when to use vs. alternatives like marm_log_show or marm_smart_recall, nor provide when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 1 tool updatev2.40.0
    • Changedmarm_graph_trace2 fields changed
      • addedInput schema / properties / include_evidence
        Added value: +{
        +  "default": true,
        +  "title": "Include Evidence",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / include_tests
        Added value: +{
        +  "default": false,
        +  "title": "Include Tests",
        +  "type": "boolean"
        +}
  2. 1 tool updatev2.37.0
    • Changedmarm_graph_index1 field changed
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "auto",
        -  "index",
        -  "status",
        -  "list"
        -]New value: +[
        +  "auto",
        +  "index",
        +  "status",
        +  "list",
        +  "auto_on",
        +  "auto_off",
        +  "auto_status"
        +]
  3. 5 tool updatesv2.35.0
    • Addedmarm_compaction
    • Addedmarm_graph_architecture
    • Addedmarm_graph_impact
    • Addedmarm_graph_index
    • Addedmarm_notebook
  4. 7 tool updatesv2.25.0
    • Removedmarm_compaction
    • Changedmarm_concept_recall1 field changed
      • addedInput schema / properties / platform
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Platform"
        +}
    • Changedmarm_delete2 fields changed
      • addedInput schema / properties / platform
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Platform"
        +}
      • addedInput schema / properties / project
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Project"
        +}
    • Removedmarm_graph_architecture
    • Removedmarm_graph_impact
    • Removedmarm_graph_index
    • Removedmarm_notebook
  5. 2 tool updatesv2.21.0
    • Addedmarm_concept_build
    • Addedmarm_concept_recall
  6. 12 tool updatesv2.17.1
    • Addedmarm_code_lookup
    • Changedmarm_compaction6 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / action / title
        Added value: +"Action"
      • addedInput schema / properties / candidate_id / title
        Added value: +"Candidate Id"
      • addedInput schema / properties / summaries / title
        Added value: +"Summaries"
      • addedInput schema / title
        Added value: +"marm_compactionArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedmarm_delete6 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / session_name / title
        Added value: +"Session Name"
      • addedInput schema / properties / target / title
        Added value: +"Target"
      • addedInput schema / properties / type / title
        Added value: +"Type"
      • addedInput schema / title
        Added value: +"marm_deleteArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Addedmarm_graph_architecture
    • Addedmarm_graph_impact
    • Addedmarm_graph_index
    • Addedmarm_graph_trace
    • Changedmarm_log_entry5 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / entry / title
        Added value: +"Entry"
      • addedInput schema / properties / session_name / title
        Added value: +"Session Name"
      • addedInput schema / title
        Added value: +"marm_log_entryArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedmarm_log_show4 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / session_name / title
        Added value: +"Session Name"
      • addedInput schema / title
        Added value: +"marm_log_showArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedmarm_notebook8 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / action / title
        Added value: +"Action"
      • addedInput schema / properties / data / title
        Added value: +"Data"
      • addedInput schema / properties / name / title
        Added value: +"Name"
      • addedInput schema / properties / names / title
        Added value: +"Names"
      • addedInput schema / properties / session_name / title
        Added value: +"Session Name"
      • addedInput schema / title
        Added value: +"marm_notebookArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedmarm_smart_recall12 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / detail / title
        Added value: +"Detail"
      • addedInput schema / properties / exact_mode / title
        Added value: +"Exact Mode"
      • addedInput schema / properties / include_logs / title
        Added value: +"Include Logs"
      • addedInput schema / properties / limit / title
        Added value: +"Limit"
      • addedInput schema / properties / platform / title
        Added value: +"Platform"
      • addedInput schema / properties / project / title
        Added value: +"Project"
      • addedInput schema / properties / query / title
        Added value: +"Query"
      • addedInput schema / properties / search_all / title
        Added value: +"Search All"
      • addedInput schema / properties / session_name / title
        Added value: +"Session Name"
      • addedInput schema / title
        Added value: +"marm_smart_recallArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedmarm_summary4 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / session_name / title
        Added value: +"Session Name"
      • addedInput schema / title
        Added value: +"marm_summaryArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
  7. 1 tool updatev2.15.2
    • Changedmarm_smart_recall3 fields changed
      • addedInput schema / properties / exact_mode
        Added value: +{
        +  "default": "auto",
        +  "type": "string"
        +}
      • addedInput schema / properties / platform
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedInput schema / properties / project
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
  8. 7 tool updatesv2.14.1
    • First observedmarm_compaction
    • First observedmarm_delete
    • First observedmarm_log_entry
    • First observedmarm_log_show
    • First observedmarm_notebook
    • First observedmarm_smart_recall
    • First observedmarm_summary

TDQS

A3.9/5.0

Scored across 14 tools

Disambiguation4/5

Tools are mostly distinct: memory recall, logging, session listing, deletion, notebook, summary, compaction, and graph operations each have clear purposes. Minor overlap exists between smart_recall and log_show (both retrieve stored content) and between code_lookup and graph_trace (both explore code), but the descriptions differentiate them well.

Naming Consistency3/5

All tools share the 'marm_' prefixaine, but the naming convention is inconsistent: some use noun phrases (marm_smart_recall, marm_log_entry, marm_graph_architecture), some use bare verbs (marm_delete), and some combine verb+object (marm_code_lookup, marm_log_show). The pattern is not uniform, making it slightly harder to predict tool names.

Tool Count4/5

The stated count is 14, but only 11 tools are documented, which is a notable discrepancy. Even so, the 11 visible tools cover memory management and code-graph analysis without feeling bloated; a handful of tools for each subdomain is reasonable.

Completeness4/5

The surface covers search, logging, notebook CRUD, summaries, compaction, and code-graph analysis (index, lookup, trace, architecture). Missing explicit update operations and a dedicated session-management tool, but these are partially handled via log_entry parameters. Overall well-rounded for a memory + code context server.

Maintenance

ActivityActive
ResponsivenessWithin a week

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    MCP server for persistent, compounding memory that automatically captures corrections and insights across AI sessions, enabling agents to learn and improve over time.
    5
    371
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI agents to maintain persistent memory across sessions by capturing conversations, extracting durable knowledge, and injecting relevant context, supporting various MCP-compatible platforms.
    12
    MIT
  • A
    license
    B
    quality
    A
    maintenance
    MCP server providing persistent memory and context for AI tools, including semantic memory, knowledge graph, and session history to avoid starting from scratch in every conversation.
    35
    14
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP server that provides AI agents with persistent memory, cross-agent sharing, and context management, enabling them to remember conversations, track complex tasks, and evolve skills across tools.
    2
    MIT