kb-memory
rag-kb — 로컬 Agent 메모리 서비스 + 다중 Agent 협업 시스템
English | 中文
이 저장소에는 두 개의 하위 시스템이 있습니다(ROADMAP):
하위 시스템 | 한 줄 요약 | 상태 |
kb | 로컬 우선, 완전 무료 Agent 메모리 및 지식 서비스(핵심 제품, 개발 주축) | v1.0.1 프로덕션 사용 가용 |
agent-orchestra | kb 공유 태스크 보드 기반의 크로스 태스크 다중 Agent 협업 시스템(❄️ 유지보수 모드, 개인용 스캐폴드) | B1-B3 마무리 동결 |
오픈소스 라이선스: Apache-2.0(특허 허여 포함, 상업적 이용 가능).
kb — 로컬 우선 Agent 메모리 및 지식 서비스
Windows 단일 프로세스 상주(python -m kb serve),REST + MCP 이중 프로토콜, Claude Code / Cursor / TraeWork / 자체 구축 Agent에 메모리 쓰기, 문서·웹페이지 등록, 하이브리드 검색(벡터 + BM25/RRF 융합) 및 RAG 질의응답을 제공합니다.
LLM 없이도 저장·조회 및 검색이 완전히 사용 가능 — 메모리 쓰기, 문서 등록, 하이브리드 검색은 어떤 대형 언어 모델에도 의존하지 않습니다. 로컬 Ollama 또는 클라우드 API를 구성하면 /ask 질의응답 기능이 자동으로 활성화됩니다.
Related MCP server: mnemostack
핵심 기능
단일 프로세스 상주: 하나의
python -m kb serve가 REST API와 MCP 엔드포인트를 동시에 제공, 추가 컴포넌트 불필요하이브리드 검색: BGE-M3 벡터 검색 + BM25 키워드 검색, RRF 융합 정렬, 중국어 토큰화에 친화적
선택적 정밀 재정렬:
KB_RERANK_ENABLED=true로 bge-reranker-v2-m3 교차 재정렬 활성화(기본 꺼짐)선택적 3-way:
KB_SPARSE_ENABLED=true로 BGE-M3 희소 벡터 제3 경로 활성화(기본 꺼짐, 실패 시 자동으로 2-way 폴백)
메모리 관리: 쓰기 / 업데이트 / 삭제 / 목록, namespace, tags, type 필터 지원
다중 클라이언트/프로젝트 격리(v2): 격리 키 =
(client, project), 신원은 환경이 담당하고 AI가 스스로 밝히지 않음 — client는 MCP clientInfo에서 자동 식별(프레임워크 수준 신뢰), project는 연결/디렉터리가 담당(기본값=해당 클라이언트의 기본 버킷);개인 메모리는 해당 클라이언트+해당 프로젝트에만 보임(타인 읽기/수정/삭제 거부), 문서/웹페이지 공유 지식은 모든 클라이언트에 보임;기본 키는 서버에서 생성접근 감사: 모든 쓰기/읽기/수정/삭제/검색/질의응답을 JSON으로
logs/agent-audit/<客户端>__<项目>.log에 기록(client+project별 파일 분리);조회 가능: RESTGET /api/v1/audit?client=<客户端>[&project=<项目>]또는 CLIkb audit --client <客户端>지식 등록: 로컬 문서(txt/md/pdf/docx 등)업로드 또는 경로 가져오기, 웹페이지 본문 크롤링 등록
디렉터리 감시: 지정 디렉터리 내 파일 추가/삭제 시 자동 등록/정리(
KB_WATCH_DIR)CLI 도구:
kb add/search/stats/ask/eval/forget/dedup— 터미널에서 직접 쓰기, 검색, 통계, RAG 질의응답 수행프라이버시 가드레일: 민감 namespace는 로컬 응답을 강제하여 외부로 나가지 않음;
/ask스마트 라우팅(로컬 우선, 어려운 문제는 클라우드 선택 가능)오프라인 사용 가능: 모델과 데이터가 모두 로컬에 있으므로 네트워크가 없어도 저장·조회 및 검색 기능이 완전합니다
빠른 시작(Windows / Linux / macOS)
Windows PowerShell:
# 1. 创建并激活虚拟环境
python -m venv venv
.\venv\Scripts\Activate.ps1
# 2. 安装依赖
pip install -r requirements.txt
# 3. 启动服务(默认监听 http://127.0.0.1:8000)
python -m kb serveLinux / macOS:
# 1. 创建并激活虚拟环境
python3 -m venv venv
source venv/bin/activate
# 2. 安装依赖
pip install -r requirements.txt
# 3. 启动服务
python -m kb serve중요:
kb명령은 가상 환경 내에만 설치됩니다. 새 터미널마다 먼저 가상 환경을 활성화하세요 (Windows.\venv\Scripts\Activate.ps1, Linux/macOSsource venv/bin/activate), 그렇지 않으면kb:未找到命令가 표시됩니다.python -m kb <子命令>을 사용하면 활성화를 건너뛸 수 있습니다.빠른 설치 대안(가상 환경 불필요, Python 3.10+):
pip install --user -r requirements.txt후python -m kb serve로 실행하세요. 다만 venv로 의존성을 격리하는 것을 우선 권장합니다.
시작 후 헬스 체크:
curl http://127.0.0.1:8000/api/v1/healthz첫 시작 시 로컬 임베딩 모델(기본 BAAI/bge-m3, 약 2GB, 사전 다운로드 캐시 필요)을 로드합니다. LLM을 구성하지 않아도 서비스는 정상 시작되며,
/ask는 503과 구성 안내를 반환합니다.LLM 기본 꺼짐(
KB_LLM_MODE=off): 서비스 시작 시 어떤 대형 언어 모델도 탐지/로드/호출하지 않습니다. 제로 VRAM, 제로 비용, 완전 오프라인. 메모리 쓰기, 문서 등록, 하이브리드 검색이 완전히 사용 가능합니다. RAG 질의응답(/ask)이 필요하면 아래 방법으로 로컬 또는 클라우드 LLM을 구성하세요.
LLM 구성(선택 사항, /ask 질의응답에 필요)
KB_LLM_MODE 기본값은 off(로드/호출 안 함);네 가지 단계:
단계 | 동작 |
| LLM을 전혀 로드/호출하지 않음; 메모리 저장·조회 및 검색 완전 사용 가능 |
| 로컬 Ollama만 사용(완전 오프라인, 프라이버시 외부 유출 제로) |
| 로컬 우선, 클라우드 폴백: 로컬 Ollama 사용 가능하면 로컬, 로컬이 없고 클라우드 Key가 있으면 클라우드 |
| 전부 클라우드(로컬은 압축과 프라이버시 격리만 수행) |
로컬 LLM(Ollama):
# 1. 安装并启动 Ollama(Windows 从开始菜单/托盘启动,不要从 AI 沙箱终端拉起)
# 2. 拉取一个适合你电脑的模型(按显存/内存选择,如 qwen3:4b 约 3.2GB、
# qwen3:1.7b 约 1.8GB;国内可用魔搭加速,拉完 ollama cp 改成短名)
ollama pull <你的模型名>
# 3. 在 .env 配置后重启服务:
# KB_LLM_MODE=local # 仅本地
# KB_LLM_MODEL=<你的模型名> # 以 `ollama list` 输出的名称为准
# KB_OLLAMA_BASE_URL=http://localhost:11434클라우드 LLM(모든 OpenAI 호환 서비스 제공사, DeepSeek에 국한되지 않음): DeepSeek / OpenAI / 通义 / 硅基流动 / Moonshot 등 모두 가능, 공통 세 가지 키:
# .env
KB_LLM_MODE=auto # 本地优先、云端降级;或 cloud 全云端
KB_LLM_API_KEY=sk-xxx # 服务商 API Key
KB_LLM_BASE_URL=https://api.deepseek.com # 换成你所用服务商的 OpenAI 兼容端点
KB_LLM_CLOUD_MODEL=deepseek-v4-flash # 云端模型名확인: GET /api/v1/healthz의 llm 필드 — local/cloud는 LLM 준비 완료, disabled는 미활성화를 의미합니다.
자주 묻는 질문: 임베딩 모델 다운로드 실패
중국 본토에서
huggingface.co에 직접 연결하면 타임아웃됩니다. HF 미러를 설정한 후 재시작하세요:export HF_ENDPOINT=https://hf-mirror.com # 或写入 ~/.bashrc 永久生效 python -m kb serve모델은 미러에서 자동으로 다운로드되어
~/.cache/huggingface/hub/에 캐시되며, 이후 네트워크가 없어도 오프라인 로드가 가능합니다.모델이 이미 로컬에 캐시되어 있지만 외부 네트워크가 없음:
kb는 오프라인 우선(로컬 캐시 먼저 히트, 실패 시에만 네트워크)방식을 사용하므로 캐시 디렉터리가 완전하다면 완전 오프라인으로 실행할 수 있습니다.
Agent가 kb에 연결하기(클라이언트 무관)
kb의 접속 규약을 AI 클라이언트(TraeWork / Claude Code / Cursor / 자체 구축 Agent)에게 주어 메모리 읽기/쓰기 방법, 어떤 신원 규약을 따르는지, 감사를 조회하는 방법을 알게 하세요. 두 가지 방법 중 하나를 선택하세요:
skill(권장, 자동 트리거 가능)— 선택적 독립 단계: 저장소 내
skills/kb-memory/SKILL.md는 클라이언트 무관한 Anthropic 개방형 포맷 skill입니다. 사용 중인 클라이언트의 사용자 수준 skills 디렉터리에 설치하면, 해당 클라이언트의 모든 프로젝트 세션은 메모리 읽기/쓰기, RAG 질의응답, 감사 조회 시 자동 인식 및 트리거됩니다. 설치 =skills/kb-memory디렉터리를 복사하면 됩니다(스크립트가 있으며 수동 복사도 가능, 의존성 불필요). 업데이트(다시 덮어쓰기), 제거, 설치 후 사용 방법은scripts/README.md참조.
설치하지 않아도 kb 서비스에는 영향이 없습니다: skill은 AI 클라이언트를 위한 「프롬프트 래퍼」일 뿐이며 서비스의 설치/시작과 무관합니다. 이 단계를 건너뛰어도 서비스는 정상 실행되고, 언제든 방법 2의 순수 텍스트 프롬프트로 연결할 수 있습니다. skill 설치는 일회성, 필요 시, 독립적으로 실행되며,
kb serve에 따라 자동 트리거되지 않고, 클라이언트 디렉터리 밖의 어떤 파일에도 기록하지 않습니다.
순수 텍스트 프롬프트(폴백, 모든 클라이언트 공용):
docs/AGENT_PROMPT.md를 통째로 복사하여 Agent에 붙여넣기만 하면 됩니다. skill 메커니즘에 의존하지 않습니다.
.trae-cn/skills/.claude/skills/.cursor/skills는 모든 클라이언트가 인정하는 「표준」인가요? — 아닙니다. 이것은 각 클라이언트의 자체 사용자 수준 규약 디렉터리일 뿐입니다:SKILL.md자체는 통일된 Anthropic 개방형 포맷이지만, 「어느 디렉터리에 설치할지, 자동 트리거 여부」는 각 클라이언트가 결정하며 지원 수준이 다릅니다:
클라이언트 | 사용자 수준 skills 디렉터리 | 자동 로드 |
TraeWork |
| 자동 발견 |
Claude Code |
| 최신 버전에서 지원 |
Cursor |
| 점진적으로 지원 |
기타 / 자체 구축 Agent | 통일된 규약 없음 | 수동 로드 필요 또는 미지원 |
「모든 클라이언트가 따르는」통일된 디렉터리는 없습니다. 클라이언트가 skill을 지원하지 않으면 언제나 방법 2가 폴백입니다 (
AGENT_PROMPT.md붙여넣기, 순수 텍스트로 모든 클라이언트에서 사용 가능). 설치 방법, 각 클라이언트 디렉터리 차이와 로딩 메커니즘, 상호 참조 관계: 자세한 내용은scripts/README.md참조(여기서 반복하지 않음).
MCP 마운트
MCP 엔드포인트(streamable HTTP):http://127.0.0.1:8000/mcp/
Claude Code: 이 저장소에는 프로젝트 수준 .mcp.json이 내장되어 있어 이 디렉터리에서 Claude Code를 시작하면 자동으로 마운트됩니다.
전역으로도 추가할 수 있습니다:
claude mcp add --transport http kb http://127.0.0.1:8000/mcp/Cursor / TraeWork 및 기타 MCP를 지원하는 클라이언트: MCP 구성에 다음 JSON을 추가하세요
(Cursor는 ~/.cursor/mcp.json 또는 프로젝트 .cursor/mcp.json에 배치;TraeWork는 설정에서 MCP 서버 추가):
{
"mcpServers": {
"kb": {
"type": "http",
"url": "http://127.0.0.1:8000/mcp/"
}
}
}마운트 후 사용 가능한 MCP 도구: write_memory / search_memory / read_memory / update_memory / delete_memory / add_document / add_webpage / ask_kb.
KB_API_KEY인증을 활성화하면 MCP 클라이언트는 연결 구성에headers(Authorization: Bearer <key>)를 추가해야 합니다. 저장소의.mcp.json템플릿에는 실제 key가 포함되어 있지 않습니다(JSON은 주석을 지원하지 않음). 구성 방법은 USER_GUIDE §5.2 참조.
REST 엔드포인트 요약
메서드 | 경로 | 설명 |
POST |
| 메모리 쓰기 |
GET |
| 메모리 목록, |
GET |
| 단일 메모리 조회 |
PATCH |
| 내용 또는 태그 업데이트 |
DELETE |
| 단일 메모리 삭제 |
POST |
| 하이브리드 검색 |
POST |
| 문서 등록: multipart |
GET |
| 등록된 문서 목록(source 기준 집계) |
DELETE |
| source 기준 해당 문서의 모든 레코드 삭제 |
POST |
| 웹페이지 등록 |
POST |
| RAG 질의응답 |
GET |
| 헬스 체크 및 서비스 통계 |
GET |
| 메모리 거버넌스 통계: |
GET |
| 거버넌스 구성: 감쇠+신선도 스위치와 파라미터(읽기 전용) |
POST |
| 의미론적 중복 제거( |
메모리 거버넌스(중복 제거/감쇠/신선도)는 기본 모두 꺼져 있으며 동작 변화가 없습니다. 사용법은 USER_GUIDE §3.5 참조.
예시:
# 写入一条记忆
curl -X POST http://127.0.0.1:8000/api/v1/memories `
-H "Content-Type: application/json" `
-d '{"content": "用户偏好深色主题", "tags": ["偏好"]}'
# 混合检索
curl -X POST http://127.0.0.1:8000/api/v1/search `
-H "Content-Type: application/json" `
-d '{"query": "用户界面偏好", "top_k": 5}'
# RAG 问答(需配置 LLM)
curl -X POST http://127.0.0.1:8000/api/v1/ask `
-H "Content-Type: application/json" `
-d '{"question": "用户喜欢什么主题?"}'구성 항목 요약표
모든 구성은 KB_ 접두사 환경 변수 또는 .env 파일로 제공됩니다. 전체 키 이름은 .env.example 참조
(.env로 복사하여 작성. .env는 gitignore 처리되어 있으며 실제 키는 로컬에만 두고 저장소에 절대 커밋 금지).
구성 항목 | 기본값 | 설명 |
|
| LLM 모드: |
| 비어 있음 | 임베딩 모델 장치: 비어 있음=자동 감지, |
|
| serve 모드 감시 디렉터리, 파일 변동 시 자동 등록;빈 문자열 또는 |
|
| 실행 데이터 루트 디렉터리(ChromaDB, 런타임 상태 등) |
|
| REST 및 MCP 수신 주소 |
|
| 임베딩 모델 |
| 비어 있음 | 로컬 Ollama 모델명(기본 비어 있음=미구성; |
|
| Ollama 엔드포인트 |
| 비어 있음 | 클라우드 LLM(선택): 모든 OpenAI 호환 서비스 제공사(DeepSeek / OpenAI / 通义 / 硅基流动 등), 로컬 |
|
| 문서 청크 분할 파라미터 |
| 비어 있음 | 쉼표로 구분된 민감 namespace, 매칭 시 로컬 응답 강제, 외부 송출 안 함 |
| 비어 있음 | 비어 있음=인증 없음(로컬 루프백 제로 마찰);비어 있지 않음=Bearer/X-API-Key 인증 활성화;orchestra 클라이언트는 자동으로 |
|
| 검색 정밀 재정렬(A3.5):융합 후보를 CrossEncoder 재정렬에 전달, 기본 꺼짐 |
|
| 희소 제3 경로(A3.5):BGE-M3 희소 벡터 + 역색인이 RRF 융합에 참여, 기본 꺼짐 |
CLI 요약(서비스 시작 불필요)
python -m kb add "记忆内容" --tags 偏好 --client TraeWork # 写入(project 缺省自动取当前目录名)
python -m kb search "查询词" --client TraeWork # 混合检索(只回本客户端+本项目的 memory)
python -m kb stats # 统计:类型分布 / 访问热度 / 陈旧分布
python -m kb ask "问题" --client TraeWork # 终端 RAG 问答(LLM 不可用时输出检索命中)
python -m kb audit --client TraeWork --days 7 # 查某客户端/项目存过/读过什么
python -m kb eval --file tests/eval_zh_50.jsonl # 检索质量评测(Recall@1/@5 + MRR)
python -m kb forget --stale --days 90 # 清理超期未命中记忆
python -m kb dedup --threshold 0.92 # 语义去重
kb ask는 로컬 서비스 로직에 직접 연결됩니다(HTTP 경유 없음).serve가 중지된 상태에서 사용할 것을 권장합니다. 이중 프로세스의 DB 쓰기 경합을 피하세요.
agent-orchestra — 다중 Agent 협업 시스템(실험)
여러 AI 어시스턴트(서로 다른 TraeWork 작업 / Claude Code 세션, 모델은 달라도 됨)가 kb 공유 작업 보드를 통해 협업 개발하도록 합니다: 코디네이터 AI가 카드를 분해·배포하고, worker AI가 카드를 받아 실행하며, 카드당 1라운드씩 결과를 회신하면 코디네이터가 검증하고 진행을 관리합니다.
# 前置:kb serve 已运行。开一个新 TraeWork 任务,粘贴以下引导语即可唤醒一个 worker:
venv\Scripts\python.exe orchestra\board.py new-worker worker-1전체 사용 방법(코디네이터가 카드를 어떻게 분해하는지, 여러 worker를 어떻게 병렬 실행하는지, 협업 규율과 알려진 제한 사항)은 사용자 매뉴얼 4장 참조.
디렉토리 구조
kb/ kb 服务源码(config / models / embedder / storage / bm25 / retriever /
service / llm / ingest / watcher / api / mcp / cli + reranker / sparse / eval)
tests/ kb 验收测试(339 项,含 eval_zh_50.jsonl 检索评测数据集)
orchestra/ 多 Agent 协作系统(board.py CLI + 协议三件套 + skill + 245 项测试)
docs/ 设计文档、节点计划、用户使用手册
kb_data/ kb 运行数据(gitignore)
_archive/ 旧学习项目归档(仅保留历史,禁止参考)더 많은 문서
AI 인계 문서(AI 어시스턴트 진입점):PROJECT.md(프로젝트 상태 / 진행 상황 보드 / 인계 가이드)
설계 문서(요구사항, 아키텍처, API, 마일스톤):
docs/superpowers/specs/2026-08-23-kb-memory-service-design.mdP2 로그 설계:
docs/superpowers/specs/2026-08-24-logging-design.mdP2 로드맵:
docs/superpowers/plans/2026-08-24-p2-roadmap.md노드 개발 계획:
docs/superpowers/plans/2026-08-23-kb-dev-nodes.mdAI 협업 규범:
AGENTS.md
Available Tools
13 toolsadd_documentB
导入本地文档(PDF/DOCX/MD/TXT 及 Office 格式)切分入库; 返回 {"source": 文件名, "chunks": 块数};文件不存在或格式不支持时 返回 {"error": "FILE_NOT_FOUND" | "UNSUPPORTED_FORMAT", "message": 原因}。 project:文档 chunk 落入该项目子库(空=全局库);client:仅用于审计归类。 English: Import a local document (PDF/DOCX/MD/TXT and Office formats), split and ingest it; returns {"source": filename, "chunks": count}; when the file is missing or the format is unsupported returns {"error": "FILE_NOT_FOUND" | "UNSUPPORTED_FORMAT", "message": reason}. project: chunks go to that project's sub-store (empty = global); client is audit-only.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| client | No | ||
| project | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden; it usefully discloses the return shape (source/chunks) and the two error codes with reasons, which is real behavioral value. However it omits permissions/auth, idempotency, and what happens on re-import or duplicate files.
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?
Front-loads the operation and return contract, which is good structure. But the entire content is duplicated in Chinese and English, roughly doubling length without adding information, and the parameter notes trail after the return-value block.
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?
With no output schema the description correctly supplies the return and error contract, and with no annotations it covers parameter meaning. It is only missing the safety/permission profile and path-format semantics, so it is close to complete for a 3-parameter ingest 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 description coverage is 0%, so the description must compensate. It does well for project (sub-store target, empty = global) and client (audit-only), but the required `path` parameter is left unqualified – no indication of whether it is a server-side or client-side path or an absolute vs relative path.
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 a specific verb (import/split/ingest) and resource (local document) plus the supported formats, so it is distinguishable from the sibling add_webpage via the 'local' qualifier. It stops short of naming the sibling explicitly, but the intent is 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 explicit when-to-use or when-not-to-use guidance. It never mentions add_webpage (the obvious alternative for remote content) or any prerequisite/precondition, leaving the agent to infer that this tool is only for local files.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_webpageA
抓取网页正文并切分入库;返回 {"source": url, "chunks": 块数}; 抓取/正文提取失败时返回 {"error": "WEB_FETCH_FAILED", "message": 原因}。 project:web chunk 落入该项目子库(空=全局库);client:仅用于审计归类。 English: Fetch a webpage body and ingest it after splitting; returns {"source": url, "chunks": count}; on fetch/body-extraction failure returns {"error": "WEB_FETCH_FAILED", "message": reason}. project: chunks go to that project's sub-store (empty = global); client is audit-only.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| client | No | ||
| project | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does reasonably well: it discloses both the success return shape ({source, chunks}) and the failure shape including the WEB_FETCH_FAILED error code and a reason message. It also explains the storage scoping rule (project sub-store vs global). It stops short of auth requirements, rate limits, or duplicate-URL behavior.
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 content is front-loaded and each piece of information is useful, but the entire description is duplicated verbatim in Chinese and English, which doubles the token cost without adding information for a reader who understands either language.
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?
There is no output schema, so the description's disclosure of the return and error shapes is exactly what is needed. For a simple 3-parameter ingestion tool with no annotations, the description covers purpose, parameters, and outcomes adequately; only operational details like deduplication or size limits are absent.
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, and it does for the non-obvious parameters: 'project' is explained as the destination sub-store with empty meaning global, and 'client' is explicitly flagged as audit-only metadata. 'url' is self-evident. This adds real meaning beyond the echoed titles in 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 description states a concrete verb chain and resource: fetch a webpage body, split it, and ingest it into the store. That is far more specific than the bare name, but it never differentiates itself from the sibling add_document (file-based ingestion) or write_memory, so an agent must infer which ingestion tool to pick.
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?
Usage is only implied by the phrase 'fetch a webpage body and ingest it' — an agent can infer this is for pulling web content into the knowledge base. There is no statement of when to prefer add_document over this tool, no prerequisites, and no exclusions (e.g. unsupported schemes or already-ingested URLs).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ask_kbA
基于知识库的 RAG 问答(检索 → 上下文拼装 → 护栏生成),返回 answer 与 sources; project:检索该项目子库 + 全局库(空=仅全局库),并写 ask 存取审计; client:来源客户端(可选,缺省从 clientInfo 自动识别,仅审计); LLM 不可用时返回 {"error": "LLM_DISABLED", "message": 配置指引}。 English: Knowledge-base RAG Q&A (retrieve → build context → guarded generation), returning answer and sources; project: search that project's sub-store plus the global store (empty = global only); an ask access-audit is emitted; client is audit-only; returns {"error": "LLM_DISABLED", "message": setup guidance} when the LLM is unavailable.
| Name | Required | Description | Default |
|---|---|---|---|
| client | No | ||
| project | No | ||
| question | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations the description carries the full burden, and it does disclose meaningful behavior: the retrieve→context→guarded-generation pipeline, the side effect that an ask access-audit is written, that client is audit-only, and the exact failure contract {"error": "LLM_DISABLED", ...}. It stops short of covering auth requirements, rate limits, or result-size limits.
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 content is front-loaded and dense, but the English block restates the Chinese block nearly verbatim, roughly doubling the length without adding information. A single-language description would carry the same payload.
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?
No output schema exists, so the description correctly takes on the return contract (answer + sources, plus the error object) and covers the one non-obvious side effect. Missing detail is limited to the shape of sources and any size or rate limits.
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 successfully explains project (sub-store + global, empty = global only) and client (optional, auto-detected from clientInfo, audit-only), which the schema alone gives no meaning for. Only 'question' is left without added detail, but its meaning is self-evident.
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 a specific verb and resource: 'Knowledge-base RAG Q&A (retrieve → build context → guarded generation), returning answer and sources'. It is unambiguous about what the tool produces, but it does not name or contrast with siblings such as search_memory, so an agent must infer the boundary itself.
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?
Usage is implied by the pipeline and by the project/client explanations, and the LLM-disabled fallback gives situational context. However, there is no explicit when-to-use-this-vs-search_memory guidance, no statement about question phrasing, and no exclusion conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_documentA
按 source 删除一份 RAG 文档/网页/表格的全部记录,返回 {"source", "deleted"}; 删除会级联清理 BM25 与向量索引;source 为空时返回 INVALID_ARGUMENT。 project 指定项目子库(空=全局库);client 仅用于审计归类。 English: Delete all records of one RAG document/webpage/table by source, returning {"source", "deleted"}; cascades to BM25 and vector indexes; empty source returns INVALID_ARGUMENT. project selects the sub-store (empty = global); client is audit-only.
| Name | Required | Description | Default |
|---|---|---|---|
| client | No | ||
| source | Yes | ||
| project | 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 and does substantial work: it discloses cascade deletion of BM25 and vector indexes, the {"source", "deleted"} return shape, the INVALID_ARGUMENT failure for empty source, and that client is audit-only metadata. It stops short of stating whether deletion is recoverable, what the `deleted` count represents, or whether elevated permissions are required for a destructive 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?
Content is front-loaded with the destructive scope and cascade behavior in the opening sentence, which is correct ordering. But the entire text is duplicated verbatim in Chinese and English, roughly doubling length with zero added information for a single agent, and the parenthetical error/parameter notes are run together in one block.
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 3-parameter destructive tool with no annotations and no output schema, the description supplies the essential load-bearing facts: what gets removed, that secondary indexes are cascaded, the return shape, and the error condition. Only permission/auth prerequisites and irreversibility are unstated, which is a minor residual gap given the rest of the coverage.
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, and it explains the role of all three parameters: project selects the sub-store (empty = global), client is audit-only, and source is the deletion key. The remaining gap is that the required `source` parameter's expected format (exact URL, path, or filename) and matching semantics are never specified.
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 a specific verb and resource with explicit scope: delete *all records* of one RAG document/webpage/table, keyed by source. That scope wording distinguishes it from the sibling delete_memory (which operates on memories, not ingested document records) without needing to open either schema.
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 when to use it (purge a whole document's records by source) and explains the project sub-store selection and the empty-source error case. However it gives no explicit when-not-to-use guidance, never mentions the delete_memory sibling, and does not say anything about confirming intent before a destructive purge.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_memoryA
按 ID 删除一条记忆;成功返回 {"ok": true},记录不存在返回 {"error": "NOT_FOUND"}。 project:先查该项目子库,再查全局库;不传时先查全局库再查各项目子库。 client:来源客户端(可选,缺省从 clientInfo 自动识别,仅审计)。 English: Delete a memory by ID; returns {"ok": true} on success and {"error": "NOT_FOUND"} when it does not exist. project: locate in that project's sub-store then the global store; when omitted, global first and then each project store. client is audit-only.
| Name | Required | Description | Default |
|---|---|---|---|
| client | No | ||
| project | No | ||
| record_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses return payloads ({'ok': true} vs {'error': 'NOT_FOUND'}), the scoped search order for project, and that client is audit-only with auto-detection from clientInfo. It omits whether deletion is permanent/irreversible and any permission requirements.
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?
Content is front-loaded and clear, but it is presented bilingually with the English text duplicating the Chinese nearly verbatim, roughly doubling the length without adding information. That redundancy costs efficiency.
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 mutating tool with no annotations and no output schema, the description covers the essentials: return values, project scoping order, and audit behavior. It is nearly complete, only missing auth/irreversibility details and guidance on obtaining record_id.
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 'project' lookup behavior and clarifies 'client' is optional and audit-only, but says nothing about the required 'record_id' (format, where to obtain it), leaving one of three params undocumented.
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 a specific verb+resource ('Delete a memory by ID') and the operation is unambiguously distinct from siblings like read_memory, update_memory, and write_memory. An agent can identify the correct tool without inspecting the schema.
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 the resolution behavior for the 'project' parameter (project sub-store vs global store, and the lookup order when omitted), which is the main usage-relevant context. It does not state explicit when-not-to-use conditions or name alternative tools, but the delete semantics are self-evident.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
link_memoryA
建立两条记忆的关联(related/supersedes/depends_on/part_of/contradicts); 重复建边幂等(created=false)。仅同作用域的 memory 记录可关联,禁止自关联; 失败返回 {"error": , "message": 原因}(NOT_FOUND/SELF_LINK/...)。 project:项目子库(空=全局库);client:仅审计。 English: Link two memories (related/supersedes/depends_on/part_of/contradicts); duplicate edges are idempotent (created=false). Only memory records in the same scope can be linked, and self-links are rejected; failures return {"error": , "message": reason}.
| Name | Required | Description | Default |
|---|---|---|---|
| to_id | Yes | ||
| client | No | ||
| from_id | Yes | ||
| project | No | ||
| relation | No | related |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses idempotency semantics (`created=false`), the scope-consistency restriction, self-link rejection, and the failure envelope `{"error": <CODE>, "message": reason}` with sample codes. It omits permission/auth requirements and the full success payload beyond the `created` flag.
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?
Each half is tight and front-loaded with the core action before the constraints, but the entire body is duplicated verbatim in Chinese and English, roughly doubling length without adding information. Efficient content, wasteful packaging.
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?
With no annotations and no output schema, the description covers the mutation's semantics, constraints, idempotency and error shape — enough to invoke correctly. Only the precise success return value and any authorization preconditions are unstated.
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 — and it does for the non-obvious parameters: the five valid `relation` values, `project` (empty = global library) and `client` (audit only). `from_id`/`to_id` are left undefined but are self-evident from the purpose statement.
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 names a specific verb and resource ("Link two memories") and enumerates the exact relation vocabulary (related/supersedes/depends_on/part_of/contradicts), which also implicitly distinguishes it from the sibling `unlink_memory`. An agent knows precisely what this tool creates without opening the schema.
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?
It gives concrete preconditions: both records must be in the same scope, self-links are rejected, and duplicate edges are idempotent. It does not explicitly route the agent to `unlink_memory`/`list_links` for the inverse or inspection cases, which keeps it 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.
list_documentsA
列出已入库的 RAG 内容(按 source 聚合,kind=doc/web/table), project 指定项目子库(空=全局库);client 仅用于审计归类。 返回 [{"source", "chunks", "chars", "last_imported", "kind"}]。 English: List ingested RAG content grouped by source (kind=doc/web/table); project selects the sub-store (empty = global); client is audit-only. Returns [{"source", "chunks", "chars", "last_imported", "kind"}].
| Name | Required | Description | Default |
|---|---|---|---|
| client | No | ||
| project | 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 supplied, so the description carries the full burden, and it does disclose genuinely non-obvious behavior: results are pre-aggregated per source with chunk and character counts, 'client' does not filter but is audit-only, and an empty project means the global store. What is missing is any statement about ordering, result limits, or behavior on an empty store — relevant for a listing call that can return many sources.
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?
Each language block is well front-loaded (purpose first, then parameters, then return shape), but the entire content is duplicated in Chinese and English, effectively doubling length with no added information. It also restates the return fields even though an output schema already exists.
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 0-required-parameter read-only listing tool with only two optional parameters and an output schema, the description covers purpose, both parameters, and aggregation semantics. The residual gap is operational detail (ordering, limits) that an agent might want when the store is large.
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, and it does: it explains that project selects the sub-store with empty meaning global, and that client is audit-only rather than a filter — meaning an agent could not derive from the schema alone. It stops short of stating accepted value formats or whether unknown project names error or return empty.
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 a specific verb and resource ('List ingested RAG content') plus the aggregation semantics ('grouped by source') and the kind values allowed (doc/web/table). It is clearly an inventory/listing tool, distinguishable in intent from siblings like ask_kb or search_memory, though it never names an alternative explicitly.
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?
Usage is only implied: the reader can infer this is the browse/inventory step rather than the retrieval step, and the note that project empty = global is a scoping rule. There is no explicit when-to-use/when-not guidance and no mention of ask_kb or search_memory as the alternative for content lookup.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_linksB
列某条记忆的一跳邻居,返回 {"record_id", "links"};每项含 id/content/type/tags/relation/direction(out/in/both)。 记录不存在返回 {"error": "NOT_FOUND"}。 English: List one-hop neighbors of a memory as {"record_id", "links"}; each item has id/content/type/tags/relation/direction (out/in/both).
| Name | Required | Description | Default |
|---|---|---|---|
| client | No | ||
| project | No | ||
| relation | No | ||
| record_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must describe behavior itself. It does describe the response keys and the error payload ('记录不存在返回 {"error": "NOT_FOUND"}'), which is useful. However, it says nothing about permissions, result-set size limits, pagination, or the cost of traversing a high-degree node.
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 purpose is front-loaded in the first clause, and the error behavior follows compactly. The content is fully duplicated in Chinese and English, which doubles the length without adding information, but each half is efficient and the overall size is manageable.
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 compensates well for the missing output schema by specifying the response keys and the NOT_FOUND payload. With no annotations and 0% parameter coverage, however, an agent still cannot tell what 'client', 'project', or 'relation' do, so the definition is not complete enough for confident 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% across 4 parameters, so the description must explain them, but it does not. 'relation' and 'direction' appear only as returned fields, not as input filters, and 'client'/'project' are never mentioned at all, leaving half the schema opaque.
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 names a precise verb and resource: 'List one-hop neighbors of a memory'. It also states the return shape, {'record_id','links'}. It never names a sibling such as search_memory or read_memory, so the agent must infer that this is a graph-traversal tool rather than a keyword search, but the purpose itself is 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?
The phrase 'one-hop neighbors' implies graph exploration, but the description gives no explicit condition for choosing this tool over read_memory or search_memory, and it does not say when not to use it. The only usage behavior it states is the NOT_FOUND case for a nonexistent record.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_memoryA
按 ID 读取单条记忆完整内容;记录不存在返回 {"error": "NOT_FOUND"}。 project:先查该项目子库,再查全局库;不传时先查全局库再查各项目子库。 client:来源客户端(可选,缺省从 clientInfo 自动识别,仅审计)。 English: Read the full content of a single memory by ID; returns {"error": "NOT_FOUND"} when absent. project: search that project's sub-store first, then the global store; when omitted, global first and then each project store. client is audit-only.
| Name | Required | Description | Default |
|---|---|---|---|
| client | No | ||
| project | No | ||
| record_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose meaningful behavior: the exact NOT_FOUND error shape, the store-resolution order for project lookups (project sub-store then global, vs global then each project store when omitted), and that client is audit-only and auto-detected. It stops short of stating permissions or the success payload shape.
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 core action is front-loaded and each sentence carries information, but the full Chinese/English duplication roughly doubles the length for a single-language agent, which is redundant rather than additive.
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?
No output schema exists, and the description covers the failure return and store-resolution behavior, which are the non-obvious parts. The success payload is only gestured at ('full content'), a minor gap for a read-by-ID 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 description coverage is 0%, so the description must compensate, and it explains two of three parameters well: project's lookup-order semantics and client being optional, auto-detected, and audit-only. record_id is left undefined but is self-evident from 'by ID'.
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 a specific verb and resource ('Read the full content of a single memory by ID'), and the singular 'by ID' framing cleanly separates it from the sibling search_memory, which returns multiple matches. An agent can pick correctly without opening the schema.
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 'by ID' phrasing implies it is a direct-lookup tool that presupposes a known identifier, but the description never states when to prefer it over search_memory or how to obtain a record_id. Usage is inferred from context rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_memoryA
混合检索记忆与知识(向量语义 + BM25 关键词,归一化融合); 返回命中列表,每项含 id/content/score/type/source。 project 指定项目子库时,检索范围 = 该项目子库 + 全局库(项目命中加分); 不传 project 时只检索全局库。 top_k 小于 1 时返回 {"error": "INVALID_ARGUMENT", "message": 原因}。 client:来源客户端(可选,缺省从 clientInfo 自动识别,仅审计)。 English: Hybrid retrieval over memories and knowledge (vector semantics + BM25 keywords, normalized fusion); returns a hit list, each item having id/content/score/type/source. With project, the scope is that project's sub-store plus the global store (project hits boosted); without project, only the global store is searched. Returns {"error": "INVALID_ARGUMENT", "message": reason} when top_k is less than 1. client: source client (optional; auto-detected from clientInfo when omitted; audit only).
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| top_k | No | ||
| client | No | ||
| project | 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 carries the full burden and largely meets it: it discloses the return shape (id/content/score/type/source per hit), the error contract for top_k < 1, the project-boost behavior, and that client is audit-only. It omits auth/permission requirements and any latency or rate-limit context, keeping it out of 5 territory.
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?
Content is front-loaded and each clause carries information, but the entire description is duplicated verbatim in Chinese and English, roughly doubling the length for the same payload. That redundancy is a real cost against a tight token budget even if it aids bilingual 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?
For a four-parameter retrieval tool with an output schema present, the description covers the scoping model, error behavior, and audit-only client well enough to call correctly. Since an output schema exists it need not detail return values, though it helpfully does; only query semantics and default top_k are left unaddressed.
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, and it does for most parameters: project's scoping effect, top_k's validation boundary, and client's optional/auto-detected/audit-only nature. The query parameter itself is left unexplained and top_k's default (5) and result-count meaning are not spelled out, so it is strong but not complete.
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 a specific verb and resource — hybrid retrieval over memories and knowledge — and even names the retrieval mechanism (vector semantics + BM25, normalized fusion), so the agent knows exactly what operation this performs. It does not, however, differentiate itself from siblings like read_memory or ask_kb, so it falls short of a 5.
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?
Usage is implied through conditional scoping rules (with project → project sub-store + global; without project → global only), which tells the agent how the call behaves. But there is no explicit guidance on when to choose this over ask_kb or read_memory, and no exclusions stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unlink_memoryB
取消两条记忆的关联(任一方向);relation 为空时删除该对全部关系。 返回 {"ok": true, "removed": 删除数};记录不存在返回 {"error": "NOT_FOUND"}。 English: Remove links between two memories in either direction; when relation is empty all relations of the pair are removed. Returns {"ok": true, "removed": n}.
| Name | Required | Description | Default |
|---|---|---|---|
| to_id | Yes | ||
| client | No | ||
| from_id | Yes | ||
| project | No | ||
| relation | 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 and does disclose return values and an error case ({"ok": true, "removed": n} and NOT_FOUND). However, it does not state whether unlinking is reversible, what permissions are required, or any destructive side effects beyond link removal.
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 core behavior is front-loaded, but the description is duplicated in Chinese and English, creating redundancy rather than added clarity. It remains reasonably short and does not bury the key relation-empty rule.
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 mutation tool with no annotations, no output schema, and five parameters at 0% schema coverage, the description leaves important gaps: parameter meanings for client/project/from_id/to_id, required permissions, and reversibility are absent. Return shape and NOT_FOUND are covered, but the overall definition is not complete enough for confident 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%, so the description must explain all five parameters, but it only clarifies relation semantics and does not explain from_id, to_id, client, or project. An agent must infer the meanings of most parameters from their names alone.
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 a specific verb and resource: remove links between two memories, with scope details such as either-direction removal and clearing all relations when relation is empty. This clearly distinguishes it from the sibling link_memory 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?
Provides implied usage guidance by explaining that an empty relation removes all relations for the pair, but it does not explicitly compare when to use this tool versus link_memory or list_links, nor does it state prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_memoryA
按 ID 更新记忆内容(变更后自动重新嵌入);记录不存在返回 {"error": "NOT_FOUND"}; 内容为空串或纯空白时返回 {"error": "INVALID_ARGUMENT", "message": 原因}。 project:先查该项目子库,再查全局库;不传时先查全局库再查各项目子库。 client:来源客户端(可选,缺省从 clientInfo 自动识别,仅审计)。 English: Update a memory's content by ID (auto re-embed on change); returns {"error": "NOT_FOUND"} when absent; empty content returns {"error": "INVALID_ARGUMENT", "message": reason}. project: locate in that project's sub-store, then the global store; when omitted, global first and then each project store. client is audit-only.
| Name | Required | Description | Default |
|---|---|---|---|
| client | No | ||
| content | Yes | ||
| project | No | ||
| record_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses auto re-embedding, that an absent record returns NOT_FOUND (i.e. no upsert), that blank content yields INVALID_ARGUMENT with a reason, and the project/global store lookup order. It omits permission/auth requirements and whether other fields are preserved, keeping it below 5.
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?
Purpose is front-loaded, but the content is fully duplicated in Chinese and English, roughly doubling the length for the same information. Each individual sentence earns its place, yet the bilingual redundancy is a real efficiency cost.
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 4-parameter mutation tool with no annotations and no output schema, the description supplies the safety-relevant behavior (error codes, no-upsert, re-embed) and the resolution semantics. Auth/authorization and field-preservation behavior are the remaining gaps.
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, and it covers all four parameters: content (empty/whitespace validation), record_id (lookup by ID), project (sub-store then global lookup order), and client (audit-only, auto-detected from clientInfo). Values are meaningful beyond the bare schema 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?
States a specific verb and resource ('Update a memory's content by ID') plus the key side effect ('auto re-embed on change'), which clearly separates it from read_memory, delete_memory, and search_memory. It never names a sibling explicitly, so it stops short of a 5, but an agent can pick it correctly without opening the schema.
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?
Usage is implied rather than stated: the ID-based update signals 'edit an existing record', and the project/client resolution rules tell the agent how to target the record. There is no explicit when-to-use vs write_memory alternative and no prerequisite guidance, so it remains minimum viable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
write_memoryA
写入一条记忆短文本(事实/笔记/摘要),可选标签;返回 {"id": 记录ID}。 内容为空串或纯空白时返回 {"error": "INVALID_ARGUMENT", "message": 原因}。 project 指定项目子库(空=全局库);client 仅用于审计归类(自动识别); 记录主键由服务端生成。 English: Write a memory short text (fact/note/summary) with optional tags; returns {"id": record_id}. Returns {"error": "INVALID_ARGUMENT", "message": reason} when content is empty or blank. project selects the project sub-store (empty = global); client is audit-bucketing only (auto-detected). The record primary key is generated server-side.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| client | No | ||
| content | Yes | ||
| project | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it states the return shape ({"id": record_id}), the validation failure mode and error payload for empty/blank content, that the primary key is server-generated, and that 'client' is audit-only and auto-detected. It omits concurrency/duplicate-handling behavior, which keeps it from a 5.
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?
Core action and return value are front-loaded, and each sentence is informative. The full bilingual duplication roughly doubles the length, but the structure remains clean and non-repetitive per language.
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 4-param write tool with no annotations and no output schema, the description covers return value, error case, and all parameter roles, which is enough for correct invocation. Remaining gaps (duplicate handling, size limits on content) are minor.
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, and it does: content is defined as the fact/note/summary text, project selects the sub-store with 'empty = global', client is audit-bucketing only, and tags is optional. Tags get only a bare mention, leaving room for richer semantics.
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 gives a specific verb+resource ('write a memory short text (fact/note/summary)') and scopes the content type, so an agent understands what the tool does. It does not explicitly differentiate itself from siblings like update_memory or add_document, so it stops short of a 5.
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?
It hints at content type (fact/note/summary) but provides no explicit when-to-use guidance, no conditions for choosing this over update_memory, add_document, or add_webpage, and no exclusions. Usage must be inferred entirely from the tool name and contents.
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.
2 tool updates
v2.4.4- Added
delete_document - Added
list_documents
3 tool updates
v2.2.0- Added
link_memory - Added
list_links - Added
unlink_memory
8 tool updates
- First observed
add_document - First observed
add_webpage - First observed
ask_kb - First observed
delete_memory - First observed
read_memory - First observed
search_memory - First observed
update_memory - First observed
write_memory
TDQS
Scored across 13 tools
Each tool has a clearly distinct resource/action: document ingestion/listing/deletion, memory CRUD, link create/delete/list, hybrid search, and RAG Q&A. The closest pair, search_memory vs ask_kb, is clearly separated by raw retrieval hits versus generated answer with sources.
All 13 tools use snake_case with an imperative verb first, and singular/plural usage is predictable (list_documents, add_document, delete_document; write/read/update/delete_memory). list_links is a minor generic noun but still fits the same verb_noun pattern.
13 tools are well-scoped for a knowledge-base plus memory server: document operations, memory CRUD/search, link operations, and one QA tool. Each tool has a clear role and none feels redundant.
Core lifecycle coverage is strong: document add/list/delete, memory create/read/update/delete/search, link create/delete/list, and RAG Q&A. Minor gaps remain: no update/replace document operation, no explicit table ingestion tool despite kind=table, and no general list-memories endpoint outside search.
Maintenance
Related MCP Connectors
Cloud or self-hosted knowledge for AI agents: hybrid search, reranking, GraphRAG, scoped MCP tools.
Persistent memory for AI agents. Semantic search, memory graph, W3C DID identity.
Persistent memory and knowledge graphs for AI agents. Hybrid search, context checkpoints, and more.
Persistent memory, knowledge graph, task management and more for AI agents via MCP.
Related MCP Servers
- AlicenseAqualityAmaintenancePersistent memory MCP server for AI coding agents (Claude Code, Codex, Gemini CLI). Hybrid retrieval (vector + BM25), cross-encoder reranking, knowledge graph, session checkpoint/resume, and multi-scope isolation. Local-first with LanceDB.3045 npm15MIT
- AlicenseAqualityAmaintenanceDurable hybrid memory for AI agents. Combines vector search, BM25, temporal retrieval, and optional Memgraph knowledge graph via reciprocal rank fusion. 6 MCP tools: health, search, answer, feedback, graph_query, graph_add_triple. Self-hosted with Qdrant backend.7278 PyPI9Apache 2.0
- FlicenseNot gradedqualityDmaintenancePersistent semantic memory MCP server for AI agents with hybrid search, LLM scoring, and decay engine, fully local.2-
- AlicenseNot gradedqualityDmaintenanceMCP server that enables persistent, hybrid, local memory for LLM agents, with vector + BM25 search, knowledge graph, and policy-driven retention, providing token-budgeted context injection for AI assistants.MIT