marm-memory
기여를 환영합니다! 기여하려면 열린 이슈를 살펴보거나, MARM Discord에 참여하여 워크플로를 공유하고, 설정 도움을 받고, 다른 빌더들과 연결하세요.
목차
Related MCP server: Memory Crystal MCP Server
빠른 시작
선호하는 에이전트 프로필로 설치 및 초기화:
pip install marm-mcp-server
marm-memory init --g-claude --g-codex --g-gemini또한 사용 가능: --g-qwen 및 --g-kiro. 플래그 없이 실행하면 홈 디렉토리 대신 현재 프로젝트 폴더에 설치됩니다
AI 동반자에게 전달하세요. 에이전트에게 다음과 같이 말하세요:
"marm-init 스킬을 사용하여 MARM을 설정하세요."
상호작용: 에이전트가 전체 설정(Python/Docker, HTTP/STDIO, 키, 클라이언트 구성)을 채팅 내에서 대화형으로 처리합니다.
수동 설정
직접 연결하는 것을 선호한다면:
"agent"를 클라이언트의 CLI 명령어(예: claude, gemini, qwen)로 바꾸세요. Codex의 경우, codex mcp add marm-memory --url http://localhost:8001/mcp를 대신 사용하세요.
사용자 유형 | 서버 시작 | MCP 클라이언트 연결 |
개인 개발자 / 연구자 |
|
|
개인 로컬 STDIO 사용자 |
|
|
메모리를 공유하는 여러 에이전트 |
|
|
개인 고처리량 스웜 |
|
|
신뢰할 수 있는 개인 연구실/서버 |
|
|
⚡ 가장 빠른 HTTP 시작: marm-memory fast-start-http를 실행하여 로컬 런타임을 시작하고, 콘솔을 실행하며, 즉시 브라우저에서 엽니다.
🖥️ 웹 콘솔: marm-memory console을 실행하여 로컬 UI 앱을 즉시 확인합니다(Node.js 필요 없음).
⚙️ 수명 주기 관리: status, logs --follow, restart, stop을 사용하여 백그라운드 데몬을 관리합니다.
💡 빠른 플래그: --no-console 또는 --no-browser를 사용하여 시작을 제한합니다. 전체 명령어 목록은 marm-memory --help를 실행하세요.
MARM Memory를 사용하는 이유
당신의 AI는 모든 것을 잊습니다. MARM Memory는 잊지 않습니다.
marm-memory는 에이전트에게 일반적으로 채팅 간에 손실되는 컨텍스트(결정, 연구, 수정, 메모, 프로젝트 기록)를 위한 개인적이고 공유된 메모리를 제공합니다. Claude Code에서 Codex나 Gemini로 전환해도 이미 수집된 컨텍스트를 잃지 않습니다.
세 가지를 함께 제공합니다:
🧠 **핵심 메모리(7개 도구)**는 대화, 메모, 노트북 항목, 요약을 저장하여 검색 가능하게 유지합니다.
💻 **코드 그래프(5개 도구)**는 저장소를 매핑하여 에이전트가 심볼을 찾고, 코드 경로를 추적하고, 모든 것을 다시 읽지 않고도 프로젝트를 이해할 수 있게 합니다. 한 번 저장소를 가리키면 작업하면서 최신 상태를 유지합니다.
🧩 **개념 그래프(2개 도구)**는 저장된 메모리에서 사람, 결정, 오류, 아이디어를 연결하고, 가능할 때 관련 코드로의 링크를 제공합니다. 메모리를 저장할 때 자동으로 구축됩니다.
14개 도구 모두 HTTP와 STDIO를 통해 작동합니다. 에이전트는 매번 처음부터 시작하는 대신 동일한 로컬 메모리를 세션 간에 공유합니다. 내장 콘솔을 통해 저장된 내용을 보고 관리할 수 있습니다.
작동 방식
계층 | 기능 | 중요성 |
메모리 모델 | 세션, 구조화된 로그, 노트북, 요약, 의미론적 메모리 | 프로젝트 기록을 하나의 채팅에 갇히지 않고 검색 가능하게 유지 |
확장 계층 | SQLite WAL 모드, 연결 풀링, 직렬화된 쓰기 큐, HTTP 속도 제한 프리셋 | 하나의 서버가 개인 사용, 다중 에이전트 작업, 스웜 스타일 버스트를 지원할 수 있게 함 |
지능 계층 | FTS 필터, 의미론적 재순위화, 제한된 의미론적 폴백, 자동 분류, 쓰기 시 통합, 압축 후보 | 메모리가 성장해도 중복이 쌓이지 않도록 하여 검색을 유용하게 유지 |
코드 그래프 계층 | 저장소 인덱싱, 심볼 조회, 호출 추적, 아키텍처 개요, 변경 영향 분석 | 전체 코드베이스를 다시 읽지 않고도 에이전트에게 프로젝트 구조 제공 |
개념 그래프 계층 | 저장된 메모리에서 엔터티 및 관계 추출, 코드 그래프로의 링크 포함 | 결정, 오류, 도구, 사람을 평문으로 남기지 않고 세션 간에 연결 |
토큰 계층 | 경량 7개 도구 핵심 표면(번들 그래프 도구 포함 총 14개), 검색 전 의미론적 재순위화, 쓰기 시 중복 제거 | 모든 검색 시 모델로 전송되는 토큰을 줄이고 메모리 확장에 따라 비용을 예측 가능하게 유지 |
배포 계층 | Pip, Docker, STDIO, HTTP, 관리형 | 동일한 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 splitsDocker 명령어는 명시적인 데이터 마운트, 네트워크 노출, 키 처리 선택이 필요하므로 아래에 별도로 문서화되어 있습니다.
성능 및 확장 벤치마크
MARM은 메모리가 성장하고 긴 메모리가 백그라운드에서 청크로 분할되더라도 빠른 검색을 우선시하도록 조정되었습니다.
이 측정값은 fastembed 기반 jinaai/jina-embeddings-v2-small-en 인코더와 임시 로컬 SQLite 데이터베이스를 사용합니다. 모든 시간 측정 경로는 출시된 MARMMemory 코드를 호출하며, 벤치마크 전용 재구현이 아닙니다. 섹션 1-4는 로컬 하드웨어에서 scripts/benchmarking/performance/bench_hotpath.py를 단일 실행한 타이밍입니다. 절대 밀리초는 시스템에 따라 다르므로 확장 형태를 신호로 간주하세요. 섹션 5는 별도의 정확도 벤치마크(run_eval.py)이며, 해당 이유로 두 번의 실행 결과를 보고합니다.
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, p954.3ms동시 검색: 10개의 수집된 검색이
151.5ms에 완료됨 (직렬176.0ms대비,gather/serial = 0.86). 이것을 병렬성으로 해석하지 마세요: 동일한 벤치마크를 반복 실행하면0.63에서0.86사이의 값이 나오므로 비율이 속도 향상을 주장할 만큼 안정적이지 않습니다. 경로는 설계상 공유 인코더 및 SQLite 작업 주변에서 직렬화되며, 겉보기 이득은 측정 노이즈입니다.
3. 쓰기 시간 수집 비용
통합 꺼짐: 중간값
6.5ms, p957.6ms통합 켜짐: 중간값
58.1ms, p95106.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 판정자는 사용되지 않습니다.
구성 | 증거 1개 적중 | 증거 전체 적중 | 평균 증거 리콜 |
MiniLM baseline | 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 | 별도 |
배포 | 기본 로컬 우선; 공유/원격용 Docker | 클라우드 API 또는 자체 호스팅 | 자체 호스팅 또는 클라우드 | 클라우드 또는 자체 호스팅 | 로컬 우선 |
검색 모델 | 하이브리드: FTS5 BM25 정확한 경로 + 의미 재순위 | 벡터 + 그래프 + 키-값 | 벡터 아카이브 저장소 + 에이전트 관리 코어 메모리 | 시간적 지식 그래프 (사실 유효성 기간) | BM25 + 벡터 + 그래프 (RRF 융합) |
쓰기 캡처 | 연결된 에이전트의 명시적 도구 호출 | 명시적 | 에이전트가 자체 메모리 편집 | 명시적 API 호출 | 후크 기반, 자동 (명시적 호출 불필요) |
코드 구조 인식 | 번들 코드 그래프 + 개념 그래프, 메모리와 융합 | 내장되지 않음 | 내장되지 않음 | 내장되지 않음 | 내장되지 않음 (별도 프로젝트와 쌍을 이룸) |
프레임워크 종속성 | 없음 (모든 MCP 클라이언트) | 없음 | 높음 (Letta 내에서 실행해야 함) | 없음 | 없음 (모든 MCP 클라이언트) |
면책 및 정확성: 경쟁사 환경은 빠르게 변화합니다. 위 표는 2026년 3분기 기준 공개 문서와 README를 기반으로 한 핵심 아키텍처 특성을 반영하며, 각 시스템의 내부 테스트 결과가 아닙니다. 대체 프레임워크에 관한 데이터 포인트가 변경되었거나 잘못 표시된 경우, 이슈를 열거나 Pull Request를 제출하여 테이블을 업데이트해 주십시오. 동료 유지 관리자의 수정을 적극 환영합니다.
MCP 클라이언트 설정: HTTP 및 STDIO
수동 pip 설치
pip install marm-mcp-server간단한 기준으로 설정 선택하기
로컬 HTTP/STDIO = 가장 빠른 단일 머신 설정.
Docker HTTP = 공유/항상 켜져 있는 서버 (키 필요).
Docker STDIO = 개인 컨테이너화된 로컬 사용 (HTTP 키 불필요).
Swarm / 다중 에이전트 참고: 쓰기 큐는 기본적으로 활성화되어 하나의 작업자를 통해 메모리 쓰기를 직렬화합니다. 공유 HTTP 배포의 경우 marm-memory start --profile swarm (200 RPM) 또는 --profile swarm-max (600 RPM)을 사용하세요. --profile trusted는 개인 배포를 위해 속도 제한을 완전히 비활성화합니다. STDIO는 여전히 개인 단일 에이전트/로컬 사용에 가장 적합합니다. 전체 테이블은 Swarm 및 다중 에이전트 사전 설정을 참조하세요.
"agent"는 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가상 환경이나 경로 기반 설정을 사용하는 경우 marm-mcp-stdio를 python -m marm_mcp_server.server_stdio로 바꾸세요. Claude Code, Cursor, VS Code, Qwen 및 Gemini CLI에서 작동합니다. STDIO는 포트나 API 키 없이 단일 로컬 프로세스로 유지되며, HTTP와 동일한 14개의 도구를 노출합니다.
여러 에이전트가 하나의 라이브 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-stdioDocker 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 --yesHTTP run, command, compose 명령은 동일한 운영 플래그를 허용합니다:
플래그 | 목적 |
|
|
| 명시적 Docker 환경 파일. 이미 |
| 호스트 HTTP 포트. 기본값: |
| 호스트 포트를 루프백 대신 |
| 네이티브 HTTP 시작과 동일한 쓰기 큐 및 속도 제한 사전 설정을 선택합니다. |
| 선택한 프로필의 HTTP 속도 제한을 재정의합니다. |
| 코드 인덱싱을 위한 반복 가능한 읽기 전용 리포지토리 마운트. MARM은 컨테이너 내에서 인덱싱할 각 해당 |
| 공식 이미지 태그. 기본값: |
| 새 HTTP 컨테이너를 생성하기 전에 선택한 이미지를 가져옵니다. |
| 관리되는 컨테이너 이름. MARM은 해당 이름의 기존 컨테이너를 교체하지 않습니다. |
| 선택적 Docker 리소스 제한. |
|
|
예를 들어:
# 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 --pullDocker STDIO는 Docker HTTP와 별개입니다: marm-memory docker stdio-command는 docker run -i --rm을 사용하며, 포트나 베어러 키가 없지만 데이터 디렉토리를 마운트하여 단기 컨테이너가 종료된 후에도 SQLite 메모리가 유지되도록 합니다. 필요할 때 해당 명령어와 함께 --data-dir 및 --tag를 사용하세요. 별도의 docker key 또는 docker 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 --swarmDocker 그래프 도구는 컨테이너 내부에서 실행되므로 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_stdioDocker 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/mcpClaude 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을 열고 원하는 서버 위에서 시작을 클릭한 다음 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는 작동하지 않습니다. HTTPS 뒤에 MARM을 노출하고 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/키 모드 · 기타 플랫폼
나열되지 않은 클라이언트를 사용 중이신가요? 이슈를 열어 알려주세요. 클라이언트 어댑터는 최우선 기능 요청입니다.
요구 사항
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개 도구)
도구 | 기능 | 주요 매개변수 |
| 호환되는 그래프가 있을 때 추가적인 제한적 개념/코드 그래프 사이드카를 사용한 하이브리드 메모리 검색 |
|
| 구조화된 세션 로그 항목 추가; 각 항목은 의미 메모리에 임베딩되어 |
|
| 필터링을 사용하여 모든 항목 및 세션 표시 |
|
| 로그 세션, 로그 항목 또는 노트북 항목 삭제 |
|
| 지능적인 요약과 함께 캐시된, 붙여넣기 가능한 세션 요약 |
|
| 세션 범위 스크래치 패드 및 영구적인 그래프 연결 문서로의 승격 |
|
| 검토 가능한 감사 추적을 통한 에이전트 지원 메모리 정리 |
|
🕸️ 코드 그래프 (5개 도구)
도구 | 기능 | 주요 매개변수 |
| 리포지토리를 코드 구조 그래프로 인덱싱, 상태 확인, 프로젝트 나열 또는 자동 재인덱싱 켜기/끄기 |
|
| 심볼, 텍스트 패턴 또는 심볼의 소스 찾기; grep/glob 대신 사용 |
|
| 함수에서 호출 경로 및 데이터 흐름 추적 |
|
| 아키텍처 개요: 모듈, 노드/엣지 분석, 스키마 |
|
| 코드 변경의 영향 범위: git diff → 영향을 받는 심볼 + 위험 |
|
🧩 개념 그래프 (2개 도구)
도구 | 기능 | 주요 매개변수 |
| 그래프 재구축 또는 자동 인덱싱 전에 저장된 메모리 인덱싱. 새 메모리는 자체적으로 인덱싱됨 |
|
| 엔티티, 관계 및 연결된 코드 심볼을 명시적으로 쿼리 |
|
14개 도구 모두 HTTP 및 STDIO에서 사용 가능합니다. 도구 표면 뒤에서 서버는 수명 주기 설정, 프로토콜 새로 고침, 문서 인덱싱, 날짜 컨텍스트, 요약 캐시 유지 관리, 쓰기 큐 처리, 개념 인덱싱, 리포지토리 변경 시 코드 재인덱싱, 프로젝트/플랫폼 귀속 및 상태 확인을 자동으로 처리합니다. 이러한 작업 중 어느 것도 에이전트의 주의나 토큰을 소모하지 않습니다. 두 그래프 엔진은 첫 번째 사용 시 지연 로드되며 시작에 실패해도 7개의 핵심 메모리 도구를 차단하지 않습니다. 메커니즘에 대해서는 아키텍처 및 내부를 참조하세요.
MARM 사용: 도구 호출 대신 대화
MARM은 내부적으로 수명 주기 작업을 처리합니다. 문서 및 세션 상태는 첫 번째 실제 도구 호출 시 초기화되며, 패키지된 문서는 소스 파일 해시 추적과 함께 marm_system 메모리 네임스페이스로 인덱싱되어 에이전트가 메모리 자체에서 MARM 사용 질문에 답변할 수 있습니다.
예제 워크플로: 교차 AI 연구 프로젝트
여러 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 refresh3단계: 재사용 가능 참조 추가 (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 projects4단계: 컨텍스트 회상 (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 context5단계: 종합 및 요약 (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 research6단계: 세션 종료 (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결과: 세 가지 다른 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지식 베이스 루프:
캡처: 구조화된 세션 학습 내용을 위해
marm_log_entry사용정리: 지식 영역별로 테마 세션 생성
종합: 정기적인
marm_summary로 지식 통합적용: 요약을
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 메모리 이해하기
두 가지 검색, 두 가지 매우 다른 문제, 하나의 도구:
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 스타일의 의미 검색입니다. 두 번째는 구문 형태 (구성 키)이므로, MARM이 이를 자동으로 감지하여 결정론적 정확 일치로 라우팅합니다. 이 정확 검색 경로는 데모에서 작동하는 메모리 시스템과 개발자가 실제로 묻는 질문(구성 키, CLI 플래그, 파일 경로, API 이름, 오류 문자열)에 답하는 시스템의 차이입니다. 순수 의미 메모리 시스템은 정확히 그러한 쿼리에서 실패합니다.
MARM은 필터→재순위화 하이브리드 회상과 정확 검색 경로를 사용합니다:
정확 경로 (
exact_mode="auto", 기본값): 구성 키, CLI 플래그, 파일 경로, API/도구 이름, 점으로 구분된 네임스페이스, HTTP 경로, URL 및 따옴표로 묶인 명령 문자열이 감지되어 결정론적 FTS5 BM25로 라우팅되고 LIKE 대체가 사용됩니다. 임베딩이 없으므로 결과가 안정적이고 문자 그대로입니다.필터→재순위화 경로: 자연어 쿼리는 먼저 FTS 인덱스에서 제한된 후보 집합을 가져온 후(
FTS_CANDIDATE_LIMIT, 기본값 200), 의미 임베딩이 해당 후보를 의미별로 재순위화합니다. 보수적인 시간 가중치는 일치 항목이 비슷할 때 최신 메모리에 약간의 우선권을 줍니다.제한된 의미 대체: FTS 적용 범위가 약하거나 사용할 수 없는 경우, MARM은 제한된 의미 스캔(
RECALL_SCAN_LIMIT)으로 대체합니다. 응답에recall_scan_truncated=true가 포함되면 대체가 한계에 도달한 것입니다. 세션/쿼리를 좁히거나 더 큰 저장소를 위해 환경 변수를 높이십시오.청크 인식 점수 매기기: 긴 메모리(약 180단어 이상)는 내부적으로 겹치는 청크 행으로 임베딩되며, 회상은 가장 잘 일치하는 청크를 사용하여 청크 점수를 하나의 상위 메모리로 축소합니다. 재순위화 경로와 대체 경로 모두 청크를 인식합니다.
이것이 저장소가 커져도 회상 지연 시간이 거의 일정하게 유지되는 이유입니다(벤치마크 참조): 의미 재순위화는 모든 임베딩을 스캔하는 대신 항상 제한된 집합을 점수 매깁니다.
정확 회상 제어: exact_mode="auto"가 일반적으로 올바릅니다. 쿼리가 RECALL_SCAN_LIMIT, --generate-key 또는 settings.py와 같은 리터럴 텍스트와 일치해야 하는 경우 exact_mode="exact"를 사용하십시오. 구문처럼 보이는 쿼리를 여전히 의미 기반 회상으로 처리해야 하는 경우 exact_mode="semantic"을 사용하십시오.
메모리 유형 및 분류
컨텍스트 로그 - 자동 분류된 대화 메모리
수동 항목 - 명시적으로 저장된 중요한 정보
노트북 항목 - 재사용 가능한 지침 및 지식
세션 요약 - 압축된 대화 기록
MARM은 쓰기 시 콘텐츠를 자동으로 분류합니다: 코드(프로그래밍 스니펫 및 기술 논의), 프로젝트(작업 대화 및 계획), 도서(문학, 학습 자료, 연구), 일반(그 외 모든 것).
프로젝트 및 플랫폼 속성
MARM은 메모리, 로그 항목 및 노트북 항목에 nullable project 및 platform 열을 저장합니다. 프로젝트는 작업 디렉토리에서 감지되고 플랫폼은 연결 클라이언트(Claude Code, VS Code, Cursor 등)에서 감지됩니다. MARM_PROJECT 및 MARM_PLATFORM은 감지를 재정의합니다. marm_smart_recall(project=..., platform=...)은 기본 필터링되지 않은 동작을 변경하지 않고 회상 범위를 지정하므로, 하나의 공유 서버가 여러 프로젝트를 교차 오염 없이 보유할 수 있습니다.
지식 그래프: 코드 및 개념
MARM은 메모리 저장소를 보완하는 두 가지 그래프 시스템을 제공합니다: 저장소의 구조를 이해하는 코드 그래프와 저장된 메모리의 주제를 이해하는 개념 그래프입니다. 동일한 프로젝트에 대해 둘 다 인덱싱되면 개념 엔터티가 코드 심볼에 교차 연결됩니다.
코드 그래프: 저장소 인덱싱 및 코드 조회
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를 사용합니다. 하나의 그래프 쿼리가 수십 번의 grep/읽기 주기를 대체하며, 여기서 토큰 절약이 발생합니다.
저장소가 인덱싱되면 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.23s(이것이 1초 미만이 아닌 유일한 쿼리입니다). MARM은 특정 릴리스를 고정하고, 시작 시 도구 스키마를 확인하며, 업스트림 도구 세트를 5개의 집중된 MCP 도구로 라우팅하여 모델 표면을 작게 유지합니다. 그래프 백엔드는 첫 번째 그래프 도구 사용 시 지연 시작되므로, 메모리, 로깅, 노트북 및 요약 도구는 여전히 빠르게 시작됩니다. Docker에서 엔진 바이너리는 이미지에 포함되어 있습니다. 로컬 pip 설치는 첫 번째 그래프 사용 시 가져옵니다(~269MB, 한 번).
저하 모드: 그래프 엔진이 시작에 실패하면(첫 실행 다운로드를 위한 네트워크 없음, 디스크 가득 참, 스키마 변경) 또는 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_name,project또는search_all=True로 범위가 지정된marm_concept_build는 자동 인덱싱이 존재하기 전에 저장된 기억을 인덱싱하고, 이를 필요로 하는 업그레이드 후에 재구축합니다.지금까지 두 번 업그레이드: 플랫폼 속성 이전에 구축된 그래프 또는 압축 소스가 인덱싱된 행으로 요약을 대체하기 전에 구축된 그래프는
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개의 집계된 시각적 가장자리로 구성된 결정론적 연결 샘플을 사용하며, 샘플링되었음이 명확하게 표시됩니다.
이는 플랫 메모리 검색이 남겨둔 교차 세션 구조적 격차를 메웁니다. 세션은 기억을 구성하지만, 개념 그래프는 기억을 연결하므로 "쓰기 대기열에 의존하는 것은 무엇인가?"라는 질문에 답변이 세 개의 다른 에이전트에서 온 다섯 개의 세션에 걸쳐 있더라도 답변할 수 있습니다.
아키텍처 및 내부 구조
위의 모든 것은 소수의 의도적인 메커니즘에서 실행됩니다. 이 섹션은 전체 지도이므로, 귀하(또는 귀하의 에이전트)는 서버가 무엇을 하고 있는지 추측할 필요가 없습니다.
스토리지 엔진
WAL 모드의 SQLite (
~/.marm/marm_memory.db) 연결 풀(5개 연결) 사용. WAL은 쓰기 중에 리더가 차단되지 않도록 하여, 한 에이전트가 쓰는 동안 여러 에이전트가 회수할 때 중요합니다.FTS5 전문 검색 인덱스 (
memories_fts)는 memories 테이블에 대한 외부 콘텐츠 테이블로 유지 관리되며, 정확한 레인(BM25)과 하이브리드 회수의 필터 단계를 모두 지원합니다.청크 저장소: 약 180단어가 넘는 기억은 각각 자체 임베딩과 함께
memory_chunks테이블에서 중복되는 150토큰 청크(50토큰 중복)로 분할됩니다. 회수는 청크에 점수를 매기고 상위 기억으로 축소합니다.임베딩은 fastembed 기반
jinaai/jina-embeddings-v2-small-en인코더에서 제공됩니다: 3300만 개의 매개변수, 512차원, 8,192토큰 컨텍스트 창, Apache-2.0 라이선스. 별도의 쿼리/문서 텍스트 접두사가 필요하지 않습니다. 인코더는 첫 번째 의미론적 사용 시 지연 로드되며 잠금 뒤에서 직렬화되어 동시 인코딩이 서로를 손상시킬 수 없습니다. 사용할 수 없는 경우 쓰기는 계속 성공합니다. 기억은 로드될 때까지 임베딩 없이 저장됩니다. 의미론적 점수 매기기는 Python 루프가 아닌 단일 NumPy 배치(행렬 코사인)로 실행됩니다.개념 그래프는 자체 데이터베이스 (
~/.marm/index/marm_index.db)와 자체 풀을 가져오며, 동일한 풀 구현을 재사용하지만 메모리 저장소와 연결을 공유하지 않습니다. 의도적인 격리: 실험적인 그래프 빌드가 프로덕션 WAL을 지연시킬 수 없어야 합니다. 유일한 예외는 인덱싱 대기열로, 의도적으로 메모리 데이터베이스에 있어 기억과 해당 인덱싱 작업이 함께 커밋되도록 합니다. 그래프 자체는 파생되고 폐기 가능한 상태로 유지됩니다.
쓰기 경로
직렬화된 쓰기 대기열 (기본적으로 활성화됨): 모든 메모리 쓰기는 하나의 내부 비동기 작업자를 통해 흘러가 다중 에이전트 부하에서 SQLite 작성자 경합을 제거합니다. 대기열은 일반적입니다. 압축 적용도 동일한 작업자를 통해 진행되므로, 어떤 하위 시스템이 쓰든 정확히 하나의 작성자가 있습니다.
MAX_QUEUE_SIZE가 이를 제한합니다.쓰기 시간 통합 (옵트인,
CONSOLIDATION_ENABLED=1)은 메모리가 저장되기 전에 두 계층을 실행합니다:계층 1, 정확한 중복 제거: 정규화된 콘텐츠의 SHA-256 해시가 세션 내에서 확인됩니다. 해시 적중은 중복 제거 전에 실제 콘텐츠와 비교하여 확인되므로, 해시 충돌은 다른 콘텐츠를 자동으로 병합하는 대신 새 행을 저장합니다.
계층 2, 의미론적 병합:
CONSOLIDATION_THRESHOLD코사인 유사도 이상의 근사 중복은 누적되지 않고 병합됩니다. 이는 쓰기를 차단하지 않습니다. 인코더를 사용할 수 없으면 쓰기는 통합되지 않고 진행됩니다.절충안은 측정되어 게시됩니다: 읽기가 메모리 워크로드를 지배하기 때문에, 깨끗하게 유지되는 저장소를 대가로 약 9배의 중간 쓰기 비용(6.5ms 대비 58ms)이 발생합니다. 위 벤치마크의 섹션 3을 참조하십시오.
개념 인덱싱은 내구성 있는 아웃박스입니다: 쓰기는 메모리와 동일한 트랜잭션에 인덱싱 작업을 기록하므로, 메모리가 없이는 존재할 수 없습니다. 백그라운드 작업자가 해당 대기열을 소진하고 개념 그래프를 씁니다. 쓰기 경로에서 추출을 기다리는 것은 없으며, 추출 중에 종료된 프로세스는 작업이 인메모리 작업이 아닌 행이므로 작업을 잃지 않습니다. 두 전송 방식 모두 작업자를 실행하므로, 메모리 데이터베이스의 임대 잠금을 통해 조정하며, 이는 프로세스 간 잠금이 아니므로 프로세스 간에 걸쳐 있을 수 없습니다.
압축 (옵트인,
COMPACTION_ENABLED=1)은 계층 3입니다: 세션에서 충분한 쓰기 후에, 백그라운드 패스는 코사인 유사도와 합집합-찾기 연결 구성 요소를 사용하여 관련 메모리 클러스터를 감지하며, 최소 클러스터 크기, 최소 기간 및 진행 중인 작업을 압축하지 않도록 활성 세션 유예 기간으로 제한됩니다. 그런 다음 MARM은 연결된 에이전트에게 각 클러스터를 요약하도록 요청하는 제한된 요청을 주입합니다:candidates→stage→review→apply또는discard. 적용 시 원본 메모리 ID가 보존되므로, 압축된 요약은 원본으로 추적 가능합니다. 단계별 요약은 만료되며(COMPACTION_STAGING_TTL_HOURS), 알림은 제한되고 쿨다운 제한이 있으며, 주입에는 바이트 예산이 있습니다. 설계는 LLM이 무엇을 위한 것인지에 대해 정직합니다: MARM이 감지하고, 에이전트가 요약하며, 인간이 검토할 수 있는 단계/적용/폐기 루프가 파괴적인 단계를 제어합니다.
회수 경로
MARM 메모리 이해하기에서 다룹니다: 정확한 레인(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"}딕셔너리로 변환됩니다.직렬화: 하나의 잠금이 단일 stdin 파이프에서 각 쓰기+읽기 왕복을 보호합니다. 비동기 호출자는
asyncio.to_thread를 통해 이동하므로 이벤트 루프가 하위 프로세스 IO에서 차단되지 않습니다.충돌 복구: stderr는 백그라운드 스레드에서 소진되고, 자식 EOF/충돌이 감지되며, 프로세스는 다음 호출 시 투명하게 다시 생성됩니다. 시간 초과는 의도적으로 충돌로 처리되지 않습니다. 긴 인덱스 실행이 여전히 작동 중일 수 있으며, 이를 종료하면 진행 중인 작업이 파괴됩니다.
감독: 지연 싱글톤 감독자가 프로세스 수명 동안 클라이언트를 소유합니다. 시작은 첫 번째 그래프 도구 호출 또는 엔진 바이너리가 이미 다운로드된 경우 자동 인덱스 폴러에 의해 트리거되며, MCP 계층으로 절대 발생하지 않으며, 고정된 바이너리의 도구 스키마를 확인하여 업스트림 드리프트가 호출 중간이 아닌 시작 시 포착되도록 합니다.
자동 재인덱싱은 파일 시스템 감시가 아닌 git 서명 폴링입니다: 백그라운드 작업은 각 인덱싱된 저장소의
HEAD및 더티 상태를 비교하며, 엔진 외부에서git을 실행하여 계산되므로 유휴 검사에 엔진 잠금이 들지 않습니다. 커밋은 재인덱싱을 트리거합니다. 트리가 더티인 동안 저장소는 매 사이클마다 재인덱싱됩니다.git status는 변경된 파일과 그 내용이 아닌 것을 보고하기 때문에, 이미 수정된 하나의 파일에 대한 반복적인 편집은 더 저렴한 지문으로 구별할 수 없는 바이트 동일 출력을 생성하기 때문입니다. Git은core.fsmonitor를 비활성화하고 정리된 환경에서 실행됩니다. 이 설정은 git이 감시된 저장소에서 타이머로 실행할 프로그램을 지정하기 때문입니다.모든 저장소 변형에 대한 하나의 게이트: 세 가지 표면 모두에 대한 수동 인덱스, 폴러 및 프로젝트 삭제는 모두 메모리 데이터베이스의 단일 임대 행을 통과합니다. HTTP와 STDIO는 하나의 공유 엔진 저장소를 통해 별도의 엔진 자식을 가진 별도의 프로세스이므로, 프로세스 내 잠금이 이를 포괄할 수 없습니다. 임대는 호출자가 기다리는 것을 중지할 때가 아니라 엔진 호출이 실제로 반환될 때 해제됩니다. 취소된 요청은 엔진이 여전히 쓰고 있는 동안 저장소를 다른 프로세스에 넘겨줄 수 없습니다.
보안 및 속도 제한
2-모드 인증 게이트: 루프백(
127.0.0.1)에서는 키 없음, 서버가 네트워크에 노출되는 순간(SERVER_HOST=0.0.0.0, Docker)MARM_API_KEY(Bearer)가 필수입니다.--generate-key는 하나를 생성합니다. 기본적으로 안전하며, 로컬에서 설정 마찰이 없습니다.IP 기반 속도 제한 슬라이딩 윈도우 및 임시 차단 포함, 구성 미로 대신 CLI 사전 설정을 통해 조정됩니다(아래 표).
로컬 우선: 모든 것은
~/.marm/아래에 있습니다. 클라우드 동기화, 텔레메트리, 외부 저장소가 없습니다.정상 종료: SIGTERM/SIGINT 핸들러는 연결 풀을 깔끔하게 비우고 닫으며, 내부 이벤트 시스템은 콜백별 오류 격리 및 시간 초과로 자동화 콜백을 실행하여 하나의 잘못된 후크가 서버를 고정시킬 수 없도록 합니다.
Swarm 및 멀티 에이전트 사전 설정
플래그 | 속도 제한 | 쓰기 큐 | 사용 시기 |
(없음) | 80 RPM | 활성화 | 일반 로컬 사용 및 소규모 3-5 에이전트 설정 |
| 200 RPM | 활성화 | 공유 HTTP 서버, 쓰기 스타일에 따라 약 15-30 에이전트 |
| 600 RPM | 활성화 | 더 무거운 로컬/비공개 swarm, 쓰기 스타일에 따라 약 50-100 에이전트 |
| 비활성화 | 활성화 | 비공개/신뢰할 수 있는 배포 전용 |
| N RPM | 변경 없음 | 사용자 정의 재정의; 0은 제한 비활성화 |
쓰기 큐는 사전 설정과 관계없이 메모리 쓰기를 직렬화합니다; swarm 플래그는 그 위에 HTTP 속도 제한을 조정합니다. 큐는 쓰기 순서를 제어합니다; 통합 및 압축은 별도의 메모리 유지 관리 계층입니다. 이 스택(WAL + 풀링 + 하나의 직렬화된 작성기 + RPM 사전 설정)은 의도적으로 "SQLite, 많은 에이전트, 단일 머신"으로 범위가 지정됩니다; 분산 다중 노드 메모리는 현재 설계 범위를 벗어납니다.
자체 유지 관리 문서
패키지된 문서는 시작 시 marm_system 메모리 네임스페이스로 인덱싱되고 50회의 도구 호출마다 새로고침되며, 소스 파일 해시 추적을 통해 변경되지 않은 문서는 건너뛰고 변경되거나 삭제된 행은 다시 인덱싱됩니다. 연결된 에이전트는 사용자가 문서를 붙여넣는 대신 marm_smart_recall을 사용하여 MARM 사용 질문에 답변할 수 있습니다.
구성 참조
변수 | 기본값 | 제어하는 내용 |
|
| 바인드 주소; |
|
| HTTP 포트 |
| (비어 있음) | 네트워크에 노출된 배포를 위한 Bearer 키 |
|
| 메모리 데이터베이스 위치 |
|
| 개념 그래프 데이터베이스 위치 |
| (자동 감지) | 프로젝트/플랫폼 속성 재정의 |
|
| IP당 분당 요청 수 (사전 설정이 재정의함) |
|
| 하나의 워커를 통해 쓰기 직렬화 |
|
| 의미론적 재순위화 전에 가져오는 BM25 후보 수; 키워드 중복이 약한 저장소에서는 증가시키고, 가장 가까운 키워드 일치로 결과를 좁히려면 감소시킴 |
|
| 의미론적 폴백 스캔의 상한; 응답에서 |
|
| 의미론적 재호출이 키워드 쿼리를 구성하는 방식: |
| (비어 있음) | 키워드 쿼리를 구성할 때 무시할 추가 쉼표로 구분된 단어. 저장소에서 너무 흔해서 신호를 전달하지 않는 용어를 위한 것 |
|
| 키워드 점수가 순위에 영향을 미치는 정도. 벤치마크 스위프(sweep)로 설정됨; 정확도는 |
|
| 하나의 메모리만 일치하거나 모든 일치가 동점일 때 사용되는 키워드 점수. 단일 키워드 일치가 완벽한 일치로 간주되어서는 안 되는 작은 저장소에서는 낮춤. |
|
|
|
|
| 최신성 부스트의 강도와 감쇠 |
|
| 쓰기 시 중복 제거 + 의미론적 병합 |
|
| 거의 중복된 항목을 병합하는 데 필요한 코사인 유사도. 혼합 순위 점수가 아닌 의미 유사도만을 기준으로 비교됨 |
|
| 백그라운드 클러스터 감지 + 에이전트 지원 압축 |
|
| 압축 패스 전 세션당 쓰기 수 |
|
| 클러스터 감지 게이트 |
|
| 단계별 요약이 만료되기 전까지 대기하는 시간 |
|
| 5가지 코드 그래프 도구의 중단 스위치 |
|
| 이미 코드 그래프에 있는 저장소의 자동 재색인. |
|
| 저장소당 git 서명 확인 간격(초). 최소 5 |
|
| git 저장소가 아닌 디렉토리의 재색인 간격(초). 저렴한 변경 확인이 존재하지 않음. 최소 60 |
|
| 자동 재색인의 색인 깊이: |
|
| 아무것도 갱신하지 않을 때 색인 게이트가 소유된 상태로 유지되는 시간. 실행 중인 색인은 자체 임대를 갱신하므로, 이는 죽은 프로세스가 색인을 차단하는 시간의 상한선일 뿐, 색인에 걸리는 시간의 상한선이 아님 |
|
| 감시 중인 프로젝트 목록이 엔진에서 다시 읽히기 전까지 신뢰되는 시간 |
|
| 개념 그래프 구축 중 페이지당 읽히는 메모리 행 수. 구축 자체의 상한선이 아님: 범위 내의 모든 메모리는 어느 쪽이든 읽힘 |
|
| 새 메모리의 자동 개념 색인. |
|
| 쓰기 후 색인이 시작되기 전의 정적 기간. 버스트가 하나의 패스가 되도록 함 |
|
| 배치당 색인되는 메모리 수. 최대 500. 낮춰도 경합이 줄지 않으며, 약간 더 나빠지는 것으로 측정됨 |
|
| 백로그를 처리하는 동안 배치 사이의 일시 중지. 색인 중 최악의 재호출을 약 270ms에서 80ms로 줄이며 드레인 시간은 약 18% 증가. |
|
| 아무것도 갱신하지 않을 때 클레임된 색인 작업이 소유된 상태로 유지되는 시간. 진행 중인 작업은 자체 임대를 갱신하므로, 이는 죽은 프로세스가 작업을 보유하는 시간의 상한선일 뿐, 배치가 걸리는 시간의 상한선이 아님. 회수된 작업은 시도 횟수를 소모하지 않음 |
|
| 메모리가 오류와 함께 보류되고 재시도되지 않기 전의 실패 시도 횟수 |
문제 해결
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.md, INSTALL-WINDOWS.md, INSTALL-MACOS.md, INSTALL-LINUX.md
STDIO 연결 실패
pip 설치 후
marm-mcp-stdio가 PATH에 있는지 확인:marm-mcp-stdio --help또는 다음 사용:
python -m marm_mcp_server.server_stdioSTDIO 전송 요구 사항에 대한 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 backend unavailable 반환
GRAPH_ENABLED가false로 설정되지 않았는지 확인(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초)과 추출 시간을 기다리세요. 쓰기 버스트는 메모리당 한 번이 아니라 한 번의 패스로 인덱싱됩니다.
CONCEPT_AUTO_INDEX가false,0,no, 또는off로 설정되지 않았는지 확인하세요.재구축 대기 중인 그래프는 인덱싱되지 않습니다. 콘솔 또는
marm-memory knowledge status에서rebuild_required를 보고하면marm_concept_build(search_all=True)를 한 번 실행하세요. 대기 중인 메모리는 이후에 처리됩니다.자동 인덱싱은 업그레이드 이후에 작성된 메모리만 다룹니다. 이전의 모든 메모리를 가져오려면 빌드를 한 번 실행하세요.
추출에 세 번 실패한 메모리는 계속 재시도되지 않고 대기됩니다. 그 이유는 작업과 함께 기록됩니다.
코드 변경이 코드 그래프에 나타나지 않음
marm-memory projects auto status실행.enabled: false는 자동 재인덱싱이 꺼져 있음을 의미하고,source: override는 환경이 아닌 저장된 스위치가 꺼진 원인임을 의미합니다.저장소가 감시되려면 먼저 한 번 인덱싱되어야 합니다.
marm-memory projects list는 등록된 항목을 보여줍니다.간격(기본값 30초)과 인덱싱 시간을 기다리세요. 커밋은 다음 확인 시 처리됩니다.
콘솔에서 삭제된 프로젝트는 의도적으로 억제되므로 오래된 감시 목록이 프로젝트를 다시 생성할 수 없습니다. 명시적으로 인덱싱하면 다시 등록됩니다.
자동 인덱싱에는 그래프 엔진이 필요하며, 엔진 바이너리가 다운로드될 때까지 유휴 상태로 유지됩니다. 그래프 도구 호출은 한 번 다운로드합니다.
인덱스가 index_in_progress 반환
다른 MARM 프로세스가 인덱싱 게이트를 보유하고 있습니다. 일반적으로 다른 전송의 폴러 또는 콘솔 인덱스 작업입니다. 프로젝트 삭제도 동일한 메시지를 보고합니다. 인덱스 중 삭제는 실행 취소되기 때문입니다. 잠시 후 다시 실행하세요.
빌드가 build_in_progress 반환
다른 MARM 프로세스가 그래프를 쓰고 있습니다. 일반적으로 다른 전송의 인덱싱 작업자입니다. 전체 재구축이 아닌 한 빌드는 짧습니다. 잠시 후 다시 실행하세요.
빌드가 lock_lost 반환
빌드가 다른 프로세스가 그래프를 인수할 수 있을 만큼 오래 중단되어 중간에 중지되었습니다. 일반적으로 일시 중단된 시스템 또는 디버거 일시 중지입니다. 중지 전에 인덱싱된 내용은 유지되며, 빌드를 다시 실행하면 나머지가 완료됩니다.
메모리가 저장되지 않음
~/.marm/디렉토리가 존재하고 쓰기 권한이 있는지 확인사용 가능한 디스크 공간 확인
간단한 메모리로 테스트: AI에게 한 줄을 저장하도록 요청하고
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")를 사용하여 스테이징된 압축 요약 검사
오류 | 원인 | 해결 방법 |
| 포트 8001이 점유됨 | 8001의 프로세스 종료 또는 다른 포트 사용 |
| 데이터베이스 디렉토리를 쓸 수 없음 |
|
| 종속성 누락 |
|
| 여러 프로세스가 DB에 액세스 | 다른 연결 닫기, 서버 다시 시작 |
| 의미 검색 모델이 다운로드되지 않음 | 첫 번째 실행에는 시간이 걸림; 인내심을 갖고 인터넷 연결 확인 |
메모리 동작, 전송, 지원되는 클라이언트, 압축 및 백업 질문은 FAQ를 참조하세요.
Star 히스토리
기여하기
MARM은 모든 수준의 기여자를 환영합니다. 코드도 도움이 되지만, 문서, 설정 노트, 클라이언트 테스트, 버그 보고서, 벤치마크, 그리고 AI 도구를 매일 사용하는 사람들의 실제 워크플로 피드백도 마찬가지로 중요합니다.
도움이 될 만한 분야:
더 많은 MCP 클라이언트, IDE 에이전트 및 운영 체제에서 MARM 테스트
문서, 스크린샷, 예제 및 플랫폼별 설정 노트 개선
명확한 재현 세부 정보와 함께 버그 또는 혼란스러운 설치 단계 보고
실제 사용에서 얻은 메모리 워크플로, 에이전트 습관 및 도구 아이디어 공유
공개 이슈 확인하기
💡 이 목록에 이름을 올리고 싶으신가요? 시작하려면 CONTRIBUTING.md 가이드를 확인하세요!
MARM 커뮤니티에 참여하세요
AI 메모리의 미래를 함께 만들어 가세요 - 코딩이 필요 없습니다!
라이선스 및 사용 고지
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 서버 설치
INSTALL-DOCKER.md - Docker 배포 (권장)
INSTALL-WINDOWS.md - Windows 설치 가이드
INSTALL-MACOS.md - macOS 설치 가이드
INSTALL-LINUX.md - Linux 설치 가이드
INSTALL-PLATFORMS.md - 플랫폼 설치 가이드
프로젝트 정보
CONTRIBUTING.md - MARM에 기여하는 방법
CHANGELOG.md - 버전 기록 및 업데이트
ACKNOWLEDGMENTS.md - 기여자 및 감사의 말
ROADMAP.md - 계획된 기능 및 개발 로드맵
LICENSE - Apache 2.0 라이선스 조건
Available Tools
14 toolsmarm_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
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | auto | |
| limit | No | ||
| query | Yes | ||
| regex | No | ||
| project | No | ||
| file_pattern | No |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | ||
| summaries | No | ||
| candidate_id | No |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | No | ||
| project | No | ||
| search_all | No | ||
| session_name | No |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | ||
| limit | No | ||
| query | Yes | ||
| project | No | ||
| platform | No | ||
| direction | No | both | |
| session_name | No |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | ||
| target | Yes | ||
| project | No | ||
| platform | No | ||
| session_name | No |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| project | No |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | ||
| since | No | ||
| project | No | ||
| base_branch | No | main |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | moderate | |
| action | No | auto | |
| project | No | ||
| repo_path | No |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | calls | |
| depth | No | ||
| project | No | ||
| direction | No | both | |
| risk_labels | No | ||
| function_name | Yes | ||
| include_tests | No | ||
| include_evidence | No |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| entry | Yes | ||
| session_name | No |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| session_name | No |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| data | No | ||
| name | No | ||
| names | No | ||
| action | Yes | ||
| project | No | ||
| platform | No | ||
| session_name | No | main |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| detail | No | ||
| project | No | ||
| platform | No | ||
| exact_mode | No | auto | |
| search_all | No | ||
| include_logs | No | ||
| session_name | No | default |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| session_name | Yes |
TDQS
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.
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.
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.
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.
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.
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 tool update
v2.40.0- Changed
marm_graph_trace2 fields changed- added
Input schema / properties / include_evidenceAdded value: +{ + "default": true, + "title": "Include Evidence", + "type": "boolean" +} - added
Input schema / properties / include_testsAdded value: +{ + "default": false, + "title": "Include Tests", + "type": "boolean" +}
1 tool update
v2.37.0- Changed
marm_graph_index1 field changed- changed
Input schema / properties / action / enumPrevious value: -[ - "auto", - "index", - "status", - "list" -]New value: +[ + "auto", + "index", + "status", + "list", + "auto_on", + "auto_off", + "auto_status" +]
5 tool updates
v2.35.0- Added
marm_compaction - Added
marm_graph_architecture - Added
marm_graph_impact - Added
marm_graph_index - Added
marm_notebook
7 tool updates
v2.25.0- Removed
marm_compaction - Changed
marm_concept_recall1 field changed- added
Input schema / properties / platformAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Platform" +}
- Changed
marm_delete2 fields changed- added
Input schema / properties / platformAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Platform" +} - added
Input schema / properties / projectAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Project" +}
- Removed
marm_graph_architecture - Removed
marm_graph_impact - Removed
marm_graph_index - Removed
marm_notebook
2 tool updates
v2.21.0- Added
marm_concept_build - Added
marm_concept_recall
12 tool updates
v2.17.1- Added
marm_code_lookup - Changed
marm_compaction6 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / action / titleAdded value: +"Action" - added
Input schema / properties / candidate_id / titleAdded value: +"Candidate Id" - added
Input schema / properties / summaries / titleAdded value: +"Summaries" - added
Input schema / titleAdded value: +"marm_compactionArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "type": "object" -}New value: +null
- Changed
marm_delete6 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / session_name / titleAdded value: +"Session Name" - added
Input schema / properties / target / titleAdded value: +"Target" - added
Input schema / properties / type / titleAdded value: +"Type" - added
Input schema / titleAdded value: +"marm_deleteArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "type": "object" -}New value: +null
- Added
marm_graph_architecture - Added
marm_graph_impact - Added
marm_graph_index - Added
marm_graph_trace - Changed
marm_log_entry5 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / entry / titleAdded value: +"Entry" - added
Input schema / properties / session_name / titleAdded value: +"Session Name" - added
Input schema / titleAdded value: +"marm_log_entryArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "type": "object" -}New value: +null
- Changed
marm_log_show4 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / session_name / titleAdded value: +"Session Name" - added
Input schema / titleAdded value: +"marm_log_showArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "type": "object" -}New value: +null
- Changed
marm_notebook8 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / action / titleAdded value: +"Action" - added
Input schema / properties / data / titleAdded value: +"Data" - added
Input schema / properties / name / titleAdded value: +"Name" - added
Input schema / properties / names / titleAdded value: +"Names" - added
Input schema / properties / session_name / titleAdded value: +"Session Name" - added
Input schema / titleAdded value: +"marm_notebookArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "type": "object" -}New value: +null
- Changed
marm_smart_recall12 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / detail / titleAdded value: +"Detail" - added
Input schema / properties / exact_mode / titleAdded value: +"Exact Mode" - added
Input schema / properties / include_logs / titleAdded value: +"Include Logs" - added
Input schema / properties / limit / titleAdded value: +"Limit" - added
Input schema / properties / platform / titleAdded value: +"Platform" - added
Input schema / properties / project / titleAdded value: +"Project" - added
Input schema / properties / query / titleAdded value: +"Query" - added
Input schema / properties / search_all / titleAdded value: +"Search All" - added
Input schema / properties / session_name / titleAdded value: +"Session Name" - added
Input schema / titleAdded value: +"marm_smart_recallArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "type": "object" -}New value: +null
- Changed
marm_summary4 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / session_name / titleAdded value: +"Session Name" - added
Input schema / titleAdded value: +"marm_summaryArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "type": "object" -}New value: +null
1 tool update
v2.15.2- Changed
marm_smart_recall3 fields changed- added
Input schema / properties / exact_modeAdded value: +{ + "default": "auto", + "type": "string" +} - added
Input schema / properties / platformAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null +} - added
Input schema / properties / projectAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null +}
7 tool updates
v2.14.1- First observed
marm_compaction - First observed
marm_delete - First observed
marm_log_entry - First observed
marm_log_show - First observed
marm_notebook - First observed
marm_smart_recall - First observed
marm_summary
TDQS
Scored across 14 tools
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.
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.
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.
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
Related MCP Connectors
Your memory, everywhere AI goes. Build knowledge once, access it via MCP anywhere.
An MCP memory server. One memory your agents share — across models, devices and apps.
Your versioned memory across every AI tool — context maps, personal memory, and tasks over MCP.
Persistent personal memory for AI assistants — save, search, and recall across every MCP client.
Related MCP Servers
- AlicenseAqualityCmaintenanceMCP server for persistent, compounding memory that automatically captures corrections and insights across AI sessions, enabling agents to learn and improve over time.5371MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to maintain persistent memory across sessions by capturing conversations, extracting durable knowledge, and injecting relevant context, supporting various MCP-compatible platforms.12MIT
- AlicenseBqualityAmaintenanceMCP 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.3514MIT
- AlicenseNot gradedqualityCmaintenanceMCP 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.2MIT