blueocean-vector
BlueOcean Vector
코딩 에이전트를 위한 공유형 영구 메모리.
Claude Code에서 Codex, Cursor로 프로젝트 중간에 바꿔도 유지되는 메모리 — 그리고 그중 하나에서 토큰이 부족해져도 살아남는 메모리.
컨텍스트 윈도우를 다 써버리고, 다른 도구를 열고, 다시 10분 동안 무슨 작업을 하고 있었는지 설명한 적이 있다면, 이 문제를 위한 것입니다. BlueOcean Vector는 사용자 머신에서 하나의 작은 서버를 실행합니다. MCP를 지원하는 모든 에이전트가 읽고 쓸 수 있습니다. 어떤 도구를 열든 "이 프로젝트에 대해 무엇을 알고 있나?"라고 묻기만 하면 이전 도구가 멈춘 지점부터 이어받습니다.
[!TIP] Claude Code에서 결정을 저장 → 내일 Codex를 열면 — 단순히 Postgres를 선택했다는 사실뿐만 아니라 왜 DynamoDB 대신 Postgres를 선택했는지를 이미 알고 있습니다.
목차
Related MCP server: AIVectorMemory
존재 이유
모든 에이전트 세션은 빈 상태로 시작합니다. 프로젝트, 제약사항, "이미 시도해봤는데 안 됐어"를 설명하고 — 세션이 끝나면 모두 사라집니다. 사용하는 모든 도구에 대해 이 과정을 반복하면, 한 시간 전에 이미 존재했던 컨텍스트를 재구축하는 데 실제로 많은 토큰을 낭비하게 됩니다.
BlueOcean Vector는 간단하고 지루한 해결책입니다: 하나의 공유 메모리 저장소, 하나의 URL, 그리고 모든 MCP 클라이언트가 호출할 수 있는 공통 도구 집합(memory_store, memory_search, memory_summarize_session 등)입니다. 무엇을 기억할지 영리하게 결정하려고 하지 않습니다 — 에이전트가 항목을 저장하고 다시 가져올 수 있는 장소를 제공할 뿐이며, 프로젝트별로 범위가 지정되어 한 코드베이스에서 검색해도 다른 코드베이스의 잡음이 나타나지 않습니다.
비교
이미 "AI 에이전트용 메모리" 프로젝트 분야는 꽤 활성화되어 있습니다. 이 프로젝트가 실제로 어디에 위치하는지 솔직히 말하는 것이 중요합니다.
프로젝트 | 에이전트가 통신하는 방법 | 무엇을 기억할지 결정하는 주체 | 의미론적 벡터 검색 |
SDK / 호스티드 API | 자동 — 수집 시 LLM이 사실을 추출 | 예, 추출 계층 뒤에 있음 | |
SDK 또는 공식 MCP 서버 | 자동 — 엔티티/관계가 지식 그래프로 추출 | 그래프 탐색에 부차적 | |
Letta (이전 MemGPT) | 전체 상태 저장 에이전트 플랫폼, 서버 + SDK | 반자동 — 에이전트 자체 LLM이 메모리를 페이지 인/아웃 | 예, 아카이브 메모리용 |
MCP 네이티브, 실행할 서버 없음 | 명시적 — 호출 에이전트가 작성 | 폴백 전용(~1.8초), 키워드 검색이 주 | |
threadctx-mcp | MCP 네이티브 | 명시적 + 선택적 수동 git 캡처 | 유료 클라우드 티어 — 로컬 모드는 키워드 전용 |
BlueOcean Vector | MCP 네이티브, 하나의 공유 서버 | 명시적 — 호출 에이전트가 작성 | 주 방식이며 항상 켜짐 |
두 가지 솔직한 결론:
"MCP 네이티브, 모든 클라이언트와 호환" 니치는 비어 있지 않음 — Memorix가 이미 그 자리에 있으며 더 많은 내장 도구를 제공합니다. 여기서 다른 점은 벡터 검색이 폴백이나 유료 티어 뒤에 있는 것이 아닌 주요 검색 경로이며, 기본 임베딩 모델이 진정 다국어(태국어+영어 테스트 완료)이고, 에이전트별 설치 제로 도구가 아닌 하나의 공유된 영구 서버로 실행되도록 설계되었다는 점입니다 — 베어러 토큰 인증, ECS로의 문서화된 경로, 쿠버네티스 준비 상태 프로브, 그리고 공유 서버가 실제로 직면하는 동시성 문제에 대한 실제 수정 사항이 포함되어 있습니다.
자동 추출 또는 통합 없음 — mem0, Graphiti, Letta, cognee, LangMem과 달리, 여기서는 대화를 읽고 무엇을 기억할 가치가 있는지 결정하지 않습니다. 이것은 의도적인 단순성 트레이드오프이지, 누락된 기능이 아닙니다: 에이전트가 명시적으로
memory_store를 호출해야 합니다. 사용자를 대신해 무엇을 유지할지 추론하는 시스템을 원한다면, 위 프로젝트 중 하나가 이보다 더 잘 수행할 것입니다.
메모리는 백만 줄을 담으려고 해서는 안 됩니다
일부 프로젝트는 백만 줄의 코드입니다. 그리고 어떤 메모리 시스템(BlueOcean Vector 포함)도 그 모든 것을 저장하려 해서는 안 됩니다. 코드 저장은 코드 검색 도구의 역할이지 메모리 서버의 역할이 아닙니다.
BlueOcean의 역할은 더 좁고 유용합니다: 무엇이 중요했는지, 그리고 어디서 찾을 수 있는지 기억하는 것. 결정, 아키텍처, "해봤는데 안 됐어" — 그렇지 않으면 에이전트가 백만 줄에서 다시 발견해야 하는 압축된 지식 — 그리고 에이전트가 세부 사항이 필요할 때 실제 코드를 가리킬 수 있는 충분한 컨텍스트를 보관합니다.
결과적으로 메모리는 실제로 기억할 가치가 있는 것에 따라 증가하며, 코드베이스의 크기에 따라 증가하지 않습니다. 백만 줄 프로젝트는 수천 개의 메모리 항목을 가질 수 있습니다. 이렇게 하면 프로젝트가 아무리 커져도 검색 비용이 저렴게 유지됩니다.
토큰 산수
메모를 다시 읽는 데서 그 차이가 드러납니다. 가장 저렴한 대안 — 에이전트가 읽는 .remember 파일에 프로젝트 노트를 덤프하는 스킬 또는 플러긴 — 파일이 컨텍스트 윈도우를 초과할 때까찌는 잘 작도하다가, 그 후로는 조용히 유용하지 않게 됩니다.
BlueOcean은 모든 검색을 토큰 예산(기본 2000 토큰, BLUEOCEAN_MAX_TOKENS로 구성 가능)으로 제한합니다. 의미 검색은 관련 항목만 가져온 후 예산을 분할합니다: ~60%는 압축된 요약, ~40%는 상위 결과의 전체 내용입니다. 예산을 초과하는 항목은 잘려나가며, 통째로 덤프되지 않습니다.
접근 법 | 검색 당 비용 | 메모리 크기와 함게 증가? |
BlueOcean Vector ( | 토큰 예산으로 제한 (기본 2000) | 아니요 — 컬렉션 크기에 관계없이 경계가 정해져 있음 |
| 전체 파일 크기와 동일 | 예 — 선형; 결국 컨텍스트 윈도우를 초과함 |
| 해당 섹션 크기와 동일 | 부분적 — 그러나 에이전트는 관련성 순위 없이 어떤 섹션일 추측해야 함 |
작은 데모 프젝트에 대한 실제 검색 결과 요약 하나 + 전테 항목 하나에 121 토큰이 반환되었습니다 — 2000-토큰 예산의 수%에 불과하며, 프로젝트가 메모리를 축적해도 이 예산은 절대 증가지 않습니다. 일반 파일로는 같은 읽기가 매번 전체 파일 비용이 들기 때문에, 5000개 항목(수십만 토큰)의 프로젝트는 한 번에 읽을 수 없습니다.
구성 방식
┌────────────┐ ┌──────┐ ┌────────┐ ┌───────────────┐ ┌──────┐
│Claude Code │ │Cursor│ │ Codex │ │Gemini/Antigrav│ │ Kiro │ ...any MCP-http tool
└─────┬──────┘ └──┬───┘ └───┬────┘ └───────┬───────┘ └──┬───┘
└───────────┴─────────┴──────────────┴────────────┘
│ http://localhost:8765/mcp
┌───────────────────────────┐
│ blueocean-mcp │ Python MCP server
│ (one shared, persistent │ (docker compose)
│ server, not per-agent) │
└─────────────┬─────────────┘
│
┌───────────────────────────┐
│ Qdrant (vector DB) │ Docker locally → ECS Fargate in the cloud
└───────────────────────────┘알아두면 좋은 몇 가지 설계 선택:
선택 | 이유 |
URL로 접근하는 하나의 서버 | 모든 주류 MCP 클라이언트(그리고 많은 niche 클라이언트)에는 "원격 서버 추가" 명령이 있습니다. 모두 같은 URL을 가리키게 하면, 우리 쪽에서 개별 구성 파일 편집이 필요 없습니다. |
Qdrant 기반, 프로젝트별 하나의 컬렉션 |
|
기본적으로 다국어 지원 | 임베딩 모델은 |
토큰 예산 읽기 |
|
stdio 전송도 가능합니다. 각 도구가 공유 서버 대신 자체 로컬 프로세스를 생허려면 아래 대안: stdio를 참조하세요. 공유 HTTP 서버가 여전히 권장되는 경로입니다; stdio는 에이전트별로 임베딩 모델의 별도 복사본을 생헙니다.
시작하기
# 1. Bring up Qdrant + the MCP server (both run in the background via docker compose)
./scripts/setup_local.sh
# 2. Register the URL with whichever agents you use
./scripts/register_mcp.sh이게 전부입니다. setupp_local.sh는 두 컨테이너를 시작하고, Qdrant가 실제로 응답할 때까지 기다린 후(단순히 "프로세스 시작" 아님), 첫 실행 시 .envi.example을 .envi에 복사하고 Python 패키지를 동기화합니다. regisster_mcp.sh는 각 도구의 자체 mcp add CLI를 호출하거나(Cursor의 경우, Cursor의 CLI는 앱이 열려 있을 때만 작동하므로 직접 ~/.cursor/mcp.json을 편집) http://localhost:8765/mcp를 가리키게 합니다.
다른 MCP-http 지원 도구(우리가 들어보지 못한 도구 포함)의 경우, 해당 도구의 "원격 MCP 서버 추가" 기능을 통해 같은 URL을 제공하기만 하면 됩니다:
http://localhost:8765/mcp에이전트가 실제로 사용하도록 가르치기
서버를 등록하면 도구를 사용 가능하게 만들 뿐입니다; 에이전트가 자체적으로 사용하도록 만들지는 않습니다. scripts/install_skill.sh는 작은 스킬 — "세션 시작 시 메모리 확인, 컨텍스트가 부족해지기 전에 메모리 쓰기" — 을 사용하는 에이전트에 설치하여, 매번 프롬프트에서 반복하지 않아도 습관이 생기도록 합니:
./scripts/install_skill.sh # interactive picker
./scripts/install_skill.sh all # install into every supported tool found
./scripts/install_skill.sh --list # see what's installed where각 도구의 자체 스킬 디렉터리에 심볼릭 링크된 하나의 정식 SKILL.md입니다 — 한 번 편집하면 모든 도구가 변경 사항을 적용합니다.
대안: stdio (에이전트별 로컬 프로세스)
Docer 사용 불가, 또는 공유 서버를 실행하지 않으려면? 다음 실행:
uv run blueocean-mcp --transport stdio --qdrant-url http://localhost:6333그리고 도구의 MCP 구성에서 url 대신 command (.venv/bin/blueocean-mcp 참조)를 가리키게 합니다.
에이전트가 얻는 도구들
도구 | 기능 |
| 항목 저장 — 내용, 요약, 중요도 점수, 영역/모듈 태그 포함 |
| 의미 검색, 토큰 예산 내에서: 저렴한 요약 먼저, 예산에 맞는 전체 내용 |
| ID로 항목의 전체 내용 가져오기 |
| ID로 항목 삭제 |
| 메모리 컬렉션이 있는 모든 프로젝트 나열 |
| 검색 전에 어떤 영역/모듈이 있는지 확인하여 쿼리 범위를 적절히 조정 |
| 다음에 이 작업을 이어받을 에이전트를 위한 간결한 인계 노트를 남깁니다 |
| 개수 및 분포, 주로 관리/디버깅용 |
합리적인 에이전트 워크플로: 세션 시작 시 memory_manifest를 호출한 다음 memory_search를 호출하여 컨텍스트를 저렴하게 로드합니다. 진행하면서 실제 결정을 memory_store에 저장합니다(중요도 5: "X 대신 Y를 선택한 이유", 중요도 3: 일상적인 상태). 도구를 전환하거나 예산이 부족해지기 전에 memory_summarize_session을 호출합니다.
구성
모든 것은 .env에 있습니다 (시작하려면 .env.example을 복사하세요). 기본값은 로컬 단일 머신에서 사용하기에 적합합니다. 주요 설정 항목은 다음과 같습니다:
BLUEOCEAN_EMBEDDING—fastembed(기본값, 로컬 및 무료),openai, 또는bedrock.BLUEOCEAN_EMBED_MODEL도 함께 설정하세요: 한 모델로 작성된 벡터는 다른 모델로 의미 있게 검색할 수 없으므로 로컬과 클라우드가 동일한 모델을 사용해야 합니다.BLUEOCEAN_QDRANT_URL— Qdrant가 위치한 곳.BLUEOCEAN_MAX_TOKENS/BLUEOCEAN_TOP_K— 기본 검색 예산.BLUEOCEAN_AUTH_TOKEN— 기본적으로 설정되지 않음 (127.0.0.1전용 사용에 적합). 이 서버를 자신의 머신 밖으로 노출하는 경우 보안을 참조하세요.
전송 방식 (streamable-http vs stdio)은 환경 변수가 아닌 CLI 플래그입니다. 이는 "이것을 어떻게 실행할까"라는 선택이며 시작 시 결정되며 지속적인 설정이 아닙니다.
관리 CLI
uv run blueocean-admin stats <project>
uv run blueocean-admin manifest <project>
uv run blueocean-admin list
uv run blueocean-admin export <project>
uv run blueocean-admin prune <project> --older-days 90 --max-importance 2 [--dry-run]
uv run blueocean-admin snapshot <project> [--out ./backups]
uv run blueocean-admin restore <project> <snapshot-file> --yes
uv run blueocean-admin generate-token --write-env[!WARNING] 둘 이상의 에이전트 세션이 프로젝트를 공유하는 경우
prune은 이를 알지 못합니다. 필터와 일치하는 항목을 삭제하며, 다른 세션이 5분 전에 작성한 항목도 포함됩니다. 먼저--dry-run으로 실행하고 광범위한 초기화보다는 좁은 필터를 선호하세요.
export는 페이로드를 JSON으로만 덤프합니다 (with_vectors=False). 이를 복원하려면 모든 것을 처음부터 다시 임베딩해야 하며, 실제 시점 복원이 아닙니다. snapshot/restore는 대신 Qdrant 자체 네이티브 스냅샷 메커니즘을 사용합니다: 벡터, 페이로드, 인덱스 상태를 원자적으로 캡처합니다. snapshot은 파일을 로컬 디스크로 다운로드하고 다운로드가 온전함이 확인되면 서버 측 복사본을 삭제합니다 (백업 대상과 동일한 Qdrant 볼륨 내에만 백업이 존재하는 것은 백업이 아닙니다). restore는 프로젝트의 현재 데이터를 덮어쓰므로 --yes가 필요합니다.
프로젝트 이름은 엄격하게 검증됩니다 (^[a-z0-9][a-z0-9_-]*$, 이 프로젝트가 이미 권장하는 디렉토리 이름 규칙과 일치). 더 이상 조용히 정규화되지 않습니다. 두 에이전트가 동일한 프로젝트의 약간 다른 표기를 추측하는 경우 ("Team A" vs "team-a") 경고 없이 하나의 컬렉션으로 병합되곤 했습니다. 이제 일치하지 않는 이름은 거부됩니다.
테스트 실행
tests/ 아래의 테스트 파일은 독립형 스크립트입니다 (if __name__ == "__main__":). pytest로 발견되는 파일이 아닙니다. 모듈로 실행하세요:
uv run python -m tests.smoke
uv run python -m tests.auth
uv run python -m tests.mcp_e2e
uv run python -m tests.backup # real snapshot -> delete collection -> restore cycle
uv run python -m tests.health # /health diagnostics + the cloud-provider self-test TTL cachetests/auth.py는 특히 인증되지 않은 요청과 잘못된 토큰 요청이 거부되고 (401) 올바른 토큰이 헤더와 ?token= 쿼리 매개변수 경로를 통해 작동하는지 확인합니다.
보안
기본적으로 인증 없음 — 127.0.0.1 전용 로컬 사용에는 합리적이지만 다른 곳에서 접근 가능해지면 합리적이지 않습니다.
[!IMPORTANT] 이 서버를 localhost 외부 (공유 머신, 클라우드)에 노출하는 경우 다른 작업을 하기 전에
BLUEOCEAN_AUTH_TOKEN을 설정하세요.
uv run blueocean-admin generate-token --write-env
docker compose up -d --force-recreate blueocean-mcp
./scripts/register_mcp.sh # reads the token from .env, re-sends it to every tool모든 도구가 URL로 원격 서버를 등록할 때 사용자 정의 헤더를 설정할 수 있는 것은 아니므로 서버는 두 가지 방식으로 토큰을 수락하며 각 클라이언트는 지원하는 방식을 사용합니다:
Authorization: Bearer <token>— Claude Code, Gemini/Antigravity?token=<token>(URL에 첨부) — Codex, Kiro, Cursor
stdio 전송은 이 과정을 완전히 건너뜁니다: 로컬에서 생성된 하위 프로세스이며 네트워크에 있지 않고 OS 프로세스 생성 권한에 의해 이미 제한됩니다.
GET /health는 의도적으로 인증되지 않으며 프로세스가 살아있는지뿐만 아니라 Qdrant가 실제로 연결 가능한지 확인합니다. 이것이 docker-compose.yml의 healthcheck가 폴링하는 대상입니다. 또한 활성 임베딩 제공자/모델을 보고하며, openai/bedrock의 경우 (fastembed의 모델 로드는 이미 프로세스 시작을 제어하므로 해당되지 않음) 과금되는 임베드 엔드포인트 대신 무료 제어 평면 호출을 통해 자격 증명을 검증하고, 결과를 BLUEOCEAN_HEALTH_EMBED_TTL 초 (기본값 60) 동안 캐싱하여 10초 프로브 간격이 매번 공급자 API 호출로 이어지지 않도록 합니다:
{"status": "ok", "qdrant": "reachable", "embedding": {"provider": "fastembed", "model": "intfloat/multilingual-e5-large", "ok": true}}토큰은 --auth-token CLI 플래그가 아닌 BLUEOCEAN_AUTH_TOKEN (환경 변수 / .env)을 통해 설정하세요. CLI 인수로 전달된 값은 ps를 통해 다른 로컬 사용자에게 표시됩니다. 요청 액세스 로깅도 기본적으로 꺼져 있습니다 (access_log=False). 지원되는 다섯 클라이언트 중 세 개가 토큰을 ?token=...으로 보내므로 일반 액세스 로그는 모든 요청마다 이를 일반 텍스트로 기록하게 됩니다.
localhost 환경을 넘어서 배포
docker compose up -d는 두 개의 장기 실행 서비스를 실행합니다: qdrant (포트 6333) 및 blueocean-mcp (포트 8765). 클라우드의 경우 동일한 두 서비스를 ECS Fargate (또는 Qdrant Cloud + 소규모 Fargate/App Runner 서비스로 blueocean-mcp)로 이동합니다. 공개 URL을 각 도구에 로컬에서와 동일한 방식으로 등록합니다. Dockerfile은 임베딩 모델을 고정하여 클라우드에서 생성된 벡터가 노트북에서 생성된 벡터와 호환되도록 합니다.
Kubernetes는 docker-compose.yml의 healthcheck:를 읽지 않습니다. Pod 사양에 자체 프로브가 필요하지만 동일한 경로를 가리킬 수 있습니다:
readinessProbe:
httpGet: { path: /health, port: 8765 }
livenessProbe:
httpGet: { path: /health, port: 8765 }이 코드를 다루기 전에 알아두면 좋은 몇 가지 주의사항
qdrant-client는 Qdrant 서버의 정확한 버전에 고정됩니다 (docker-compose.yml의 이미지 태그 참조). Qdrant는 클라이언트와 서버를 함께 버전 관리하며 API가 릴리스 간에 변경되었습니다..search()는 1.19에서.query_points()를 위해 제거되었습니다. 서버 이미지를 업그레이드하면qdrant-client도 일치하도록 업그레이드하고 테스트 스위트를 다시 실행하세요. 실제 데이터에서 여러 버전을 건너뛰지 말고 먼저 스냅샷을 만드세요.mcp는>=2.0.0,<3.0.0으로 고정되어 있습니다 — 여기 있는 대부분의 종속성보다 더 엄격합니다. API (mcp.server.mcpserver.MCPServer등)는 릴리스 간에 모양이 크게 변경되었으며 느슨한 제약 조건은 Docker 빌드가 호환되지 않는 버전을 조용히 해결할 위험이 있습니다. Docker 빌드는uv.lock을 사용하지 않습니다.임베딩 제공자와 모델은 한 쌍입니다. 둘 중 하나를 전환하면 이전 벡터는 새 벡터에 대해 검색할 수 없는 쓰레기가 됩니다. 라이브러리 기본값(예상치 못하게 변경될 수 있음)을 신뢰하지 말고
.env에서 모델을 고정하세요.
라이선스
MIT — LICENSE를 참조하세요.
Available Tools
8 toolsmemory_deleteC
Delete a single memory entry by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| project | Yes | ||
| point_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full disclosure burden. It only says 'Delete', which implies irreversibility, but fails to state this explicitly, required auth scopes, or if the deletion is soft or hard. No annotation contradiction.
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?
Single sentence with no filler. Could arguably add 'irreversibly' for transparency, but current length is efficient.
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 2 required params, 0% coverage, an output schema exists but is not referenced, and 7 siblings. The description is too minimal; it omits return value info, ID source hints, and deletion semantics. Incomplete for reliable agent selection.
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?
With 0% schema description coverage, the description must compensate. It does not explain what 'project' or 'point_id' represent, their formats, or any validation rules. The description adds no paramenter meaning beyond the schema's field names.
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 action ('Delete') and the resource ('a single memory entry'), differentiated from siblings like memory_store or memory_search. The 'by ID' detail specifies the key identifier.
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 vs alternatives (e.g., memory_summarize_session might delete differently), no prerequisites for which IDs are valid, and no consequences like cascading effects.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_getA
Fetch the full content of a single memory entry by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| project | Yes | ||
| point_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must carry the full behavioral burden. It states it retrieves content, but it does not disclose any side effects (none expected for get), permissions needed, or error behavior (e.g., what happens if point_id not found). The lack of annotations is mitigated by the read-only nature implied by 'Fetch', but more context on behavior would improve the score.
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 a single sentence, short and front-loaded with action and object. It contains no redundant information, earning its place. However, it lacks any additional detail that could make it more helpful without expanding much.
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 (2 parameters, no output schema, no nested objects), the description is adequate for a basic retrieval. However, it leaves gaps: the 'project' parameter is unexplained, and the response format is not described (no output schema). A more complete description could clarify the project scope or that the full content is returned.
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. The description mentions 'by ID' which aligns with 'point_id', but it does not explain the 'project' parameter's role or provide any context beyond what the schema already offers. The description adds minimal value, leaving the agent to infer the purpose of 'project'.
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 uses a specific verb ('Fetch'), identifies the resource ('a single memory entry'), and specifies the retrieval mode ('full content by ID'). It clearly distinguishes from sibling tools like memory_search (searches) or memory_list_projects (lists), as it targets a single entry by a unique identifier.
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 is clear but does not provide explicit guidance on when to use this tool vs alternatives. It implies usage for retrieving a known memory entry by ID, but it does not mention when not to use it (e.g., for partial content) or direct the agent to other tools like memory_search for lookup by content.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_list_projectsB
List all projects that have a memory collection.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It only says 'List all projects,' failing to disclose read-only nature, return format, authentication needs, or any side effects. This is insufficient for safe agent usage.
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?
One concise sentence with no unnecessary words. Every part adds value, and it is front-loaded with the action and target.
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 complexity, the description should clarify what is returned (list of project names? IDs?). It is adequate for a simple listing but incomplete for an agent to fully understand the output.
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?
There are zero parameters, so schema coverage is 100% by default. Per guidelines, 0 params yields a baseline of 4. The description adds no param semantics, but none are needed.
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 lists 'all projects that have a memory collection,' using a specific verb and resource. It is distinct from sibling tools like memory_store or memory_search, though it does not explicitly differentiate from memory_stats or memory_manifest.
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 is provided on when to use this tool vs alternatives (e.g., memory_stats might list stats). The description only states what it does, leaving the agent without context for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_manifestC
Show the areas/modules present in a project's memory.
| Name | Required | Description | Default |
|---|---|---|---|
| project | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description bears full responsibility for disclosing behavioral traits. It does not mention whether the operation is read-only, what happens if the project does not exist, or any side effects (likely none). The verb 'Show' implies a read operation, but this is 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?
The description is a single sentence, which is very concise. However, it is somewhat under-specified for a tool with no annotations and no param descriptions, so it leans slightly toward being too brief rather than optimally informative.
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 complexity (1 required param, no annotations, no output schema), the description is incomplete. It does not explain what 'areas/modules' mean, what the output format looks like, or how this differs from memory_stats. An agent would need to infer too much.
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 for the single parameter 'project'. It does not explain what valid project values are, how to specify them (e.g., name, ID), or whether the parameter is case-sensitive. This leaves the agent guessing.
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 verb 'Show' and the resource 'areas/modules present in a project's memory', which is specific and distinguishes it from siblings like memory_stats (which likely shows statistics) or memory_store (which stores data).
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 alternatives such as memory_stats or memory_search. The description does not provide context about what kind of memory overview this offers or when it is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_searchC
Semantic search a project's memory with token-budgeted return (summary + full layers).
| Name | Required | Description | Default |
|---|---|---|---|
| area | No | ||
| query | Yes | ||
| top_k | No | ||
| module | No | ||
| project | Yes | ||
| max_tokens | No | ||
| importance_min | No | ||
| time_range_end | No | ||
| time_range_start | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description must carry the full burden. It hints at token budgeting and a two-layer result structure, but it doesn't disclose what happens when the token budget is exceeded (truncation? sorting?), whether the tool is idempotent/read-only, or any rate-limit concerns. For a semantic search that returns multiple entries, key behavioral traits like ordering (by relevance?) and result format are underspecified.
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 a single, front-loaded sentence with no wasted words. It could improve clarity by unpacking jargon like 'full layers' and 'token-budgeted return', but it remains concise and scannable. A small structure improvement would be breaking into two sentences 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 the high complexity (9 parameters, zero descriptions, no output schema), a one-line description is vastly insufficient. It omits the return format structure, ordering, how filters combine, and the role of the token budget. The agent cannot reliably determine how to craft calls or interpret results from this definition alone.
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% for the nine parameters, so the description must compensate. It mentions 'query' and 'token-budgeted' (mapped to max_tokens) but fails to explain area, module, top_k, importance_min, time_range_start, time_range_end, or their interplay. Most parameters remain opaque to the agent, making effective invocation difficult.
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 performing a semantic search over a project's memory with a token-budgeted return that includes both a summary and full layers. This distnguishes it from siblings like memory_get (exact retrieval) and memory_store (write), but it doesn't explicitly contrast them. The purpose is well-stated but could be strengthened by naming when to prefer this over other memory tools.
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 no guidance on when to use semantic search vs. the alternative memory tools like memory_get or memory_list_projects. It doesn't state prerequisites, restrictions (e.g., project must exist), or typical use cases. With seven siblings, explicit 'when to use' advice is missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_statsB
Admin: collection stats (count, importance/area distribution, size).
| Name | Required | Description | Default |
|---|---|---|---|
| project | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description bears full responsibility for behavioral disclosure. It mentions the output includes 'count, importance/area distribution, size' but does not explicitly state that the operation is read-only, what permissions are required beyond 'Admin', whether any side effects occur, or if rate limits apply. The safety profile is only implied by the nature of 'stats'.
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 extremely concise—one short sentence with no filler. It front-loads the key information ('Admin: collection stats') and then lists the statistics provided. However, it could be slightly more informative without losing conciseness (e.g., specifying the parameter). It earns its place but is at the edge of under-specification.
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 (one parameter, no output schema), the description covers the high-level output but omits the return format (e.g., object keys, data types) and any explanation of valid values for 'project'. With no output schema, the agent might need to guess the structure. The description is minimally complete for a stats retrieval but lacks enough detail for reliable invocation without domain knowledge.
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% for the single required parameter 'project'. The description does not explain what 'project' represents (e.g., project name, ID, or path) or how to use it. The phrase 'collection stats' loosely ties to the parameter, but the agent is left guessing whether 'project' refers to a project identifier or a collection name. The description adds no semantic value beyond the schema's bare type.
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: it provides admin-level collection statistics including count, importance/area distribution, and size. This distinguishes it from sibling tools like memory_list_projects (which lists projects) and memory_search (which searches within a collection). The verb 'stats' implies retrieval, and the resource is 'collection stats', making the intent 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?
No guidance is provided on when to use this tool versus alternatives. The prefix 'Admin:' hints at restricted access, but there is no explicit statement of prerequisites, user roles, or scenarios where other tools (e.g., memory_list_projects, memory_get) would be more appropriate. The agent receives no help in deciding between memory_stats and its siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_storeC
Persist a memory entry for a project (content + condensed summary + importance + area/module).
| Name | Required | Description | Default |
|---|---|---|---|
| area | Yes | ||
| module | Yes | ||
| content | Yes | ||
| project | Yes | ||
| summary | Yes | ||
| metadata | No | ||
| importance | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must fully disclose behavior. It mentions persistence but does not state whether this is a create or update operation, if it overwrites existing entries, or what idempotency guarantees exist. For a tool that stores data, these details are critical.
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 a single sentence, concise and front-loaded. It effectively conveys the core action, but could benefit from a second sentence to cover usage guidance or behavioral notes without being overly verbose.
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, 0% schema coverage, no annotations, and an output schema (not described), the description is incomplete. It fails to clarify what the tool returns, how conflicts are handled, or how 'importance' is interpreted. The sibling tools suggest a rich system, but this description lacks enough detail for an agent to use it confidently.
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 needs to compensate. It mentions content, summary, importance, area, and module but adds no extra context (e.g., format, constraints, or relationships). The 'metadata' and 'importance' parameters lack any semantic explanation beyond what the schema provides.
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 it persists a memory entry and lists the key fields (content, condensed summary, importance, area/module). It distinguishes the tool from siblings like memory_search and memory_get, but could be more explicit about its unique role among the sibling tools.
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 no guidance on when to use this tool vs alternatives like memory_summarize_session or memory_manifest. It does not specify prerequisites, when not to use it, or how it fits into the workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_summarize_sessionC
Store a condensed summary of a work session for later retrieval.
| Name | Required | Description | Default |
|---|---|---|---|
| area | Yes | ||
| project | Yes | ||
| conclusion | Yes | ||
| importance | No | ||
| session_id | Yes | ||
| observations | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description only states 'store for later retrieval' without disclosing side effects like overwriting, idempotency, or dependencies. With no annotations, the bare description fails to convey behavioral traits beyond basic write operation.
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 a single sentence of 10 words, which is very concise. However, it lacks any structure (e.g., bullet points, examples) and does not earn its place by providing sufficient information for a tool with 6 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?
Given the 6 parameters (5 required), 0% schema coverage, and no annotations, the description is severely incomplete. It does not explain the purpose of each parameter, expected output, or constraints, making it inadequate for correct tool invocation.
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% and the description adds no parameter-level meaning. The agent receives no explanation for fields like project, area, observations, conclusion, session_id, or importance, leaving critical semantics ambiguous.
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 stores a condensed summary of a work session, using a specific verb and resource. It distinguishes from generic memory_store by emphasizing session summaries, but does not explicitly differentiate from siblings like memory_store or memory_search.
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 is provided on when to use this tool versus alternatives (e.g., memory_store for raw data, memory_search for retrieval). The description lacks context for prerequisites or preferred scenarios.
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.
8 tool updates
v0.1.0- First observed
memory_delete - First observed
memory_get - First observed
memory_list_projects - First observed
memory_manifest - First observed
memory_search - First observed
memory_stats - First observed
memory_store - First observed
memory_summarize_session
TDQS
Scored across 8 tools
Each tool targets a distinct memory operation: stats, store, search, get by ID, delete, list projects, manifest areas, and session summary. No two tools overlap in purpose, ensuring clear differentiation for an agent.
All tools follow the uniform 'memory_<verb>_<noun>' pattern with snake_case. Verbs are descriptive and consistent (stats, store, search, get, delete, list_projects, manifest, summarize_session), making the set predictable and easy to navigate.
With 8 tools, the surface covers the core memory management lifecycle (create, read, delete, search) plus administrative utilities (stats, manifest, project listing, session summary). This is well-scoped without being excessive or sparse.
The tool set covers the fundamental CRUD operations except for an explicit update/modify tool. While search and get provide read access, and store creates new entries, the absence of an update operation is a minor gap that agents may need to work around.
Maintenance
Related MCP Connectors
Long-term memory for AI coding agents: durable project facts, recalled by every MCP client.
Persistent AI memory shared across Claude, ChatGPT, coding agents, and compatible MCP clients.
Hosted MCP memory for coding agents: persistent across sessions, editable markdown, team sharing.
An MCP memory server. One memory your agents share — across models, devices and apps.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA self-hosted MCP server that provides AI assistants with a shared, persistent SQLite-backed memory for storing and retrieving project context, decisions, and discoveries. It enables cross-session continuity and team-wide knowledge sharing to keep AI coding tools aligned and informed.3MIT
- AlicenseBqualityDmaintenanceMCP server that provides cross-session persistent memory for AI coding assistants using local vector database and semantic search, enabling automatic recall of project context, issues, and tasks.9137 PyPI92Apache 2.0
- AlicenseAqualityDmaintenanceMCP server that provides a shared semantic memory layer for AI coding agents, enabling teams to store, search, and sync context, decisions, and knowledge across projects with project-based isolation and multi-backend support.141MIT

threadctx-mcpofficial
AlicenseAqualityDmaintenanceShared memory MCP server for AI coding agents, enabling context sharing across sessions with local SQLite or cloud-based semantic search, compatible with Claude Code and Cursor.232 npm1MIT