scholar-rag-mcp
scholar-rag-mcp
상태: 프리뷰 릴리스(v0.1.0). 인터페이스와 저장소 구조는 향후 버전에서 변경될 수 있습니다.
scholar-rag-mcp는 배포 가능한 학술 논문 지식 베이스 MCP 도구입니다. PDF 폴더를 지정하면 각 논문을 실제 파싱 파이프라인(MinerU)으로 처리하고, 메타데이터를 정규화하고, 섹션 구조에 주석을 달고, 텍스트를 청크로 나누어 임베딩한 다음, 모든 것을 Qdrant에 저장합니다. 이후 에이전트(또는 사용자)는 청크를 의미적으로 검색하고, PubMed 스타일 문서 쿼리를 실행하고, 전체 텍스트를 섹션별로 읽고, 개별 논문을 추가/제거하고, 지식 베이스를 관리할 수 있습니다. 이 모든 것은 stdio를 통한 11개의 MCP 도구로 이루어집니다. 임베딩, 주석, 재랭킹은 프로세스 내 폴백을 지원하는 OpenAI 호환 모델 서비스(vLLM)에서 실행됩니다.
기능
실제 수집 파이프라인: MinerU PDF 파싱(python/cli/api 백엔드) -> 메타데이터 추출(로컬 휴리스틱, CrossRef, 선택적 GROBID) -> 정제 -> 섹션 주석 -> 결정적 청킹(300/1500/100자 설정 가능) -> 임베딩.
대규모 고속 검색: 임베딩 1차 검색 + 크로스 인코더 재랭킹, 선택적 메타데이터 필터링(
doc_id,section,year,journal, ...)은 Qdrant 인덱스 내부에서 평가됩니다. 100k 청크 기준 p95 쿼리 지연 시간 < 1초(docs/perf-report.md참조).비동기 작업:
create_kb/add_document는 백그라운드 작업이며 진행 상황은get_job으로 조회할 수 있습니다. 재시작에 안전합니다(중단된 작업은 복구되어 재실행 시 건너뜁니다).컨텍스트 안전 읽기: 페이지네이션된
get_document_text와 하드 크기 상한; 개요 먼저, 페이지는 요청 시.stdio를 통한 11개 MCP 도구:
list_kbs,create_kb,delete_kb(2단계),add_document,remove_document,get_document,get_document_text,list_documents,search_documents,search_chunks,get_job.자체 포함 저장소: 지식 베이스는 단일 데이터 디렉터리(
~/.scholar-rag) 아래에 위치합니다. Qdrant는 자동 실행(단일 바이너리, 버전 고정)되거나 외부 인스턴스에 연결됩니다.
Related MCP server: RAG MCP Server
설치
pixi가 필요합니다. 저장소 루트에서:
pixi install # installs the default environment이 프로젝트는 각각 다른 용도를 제공하는 세 개의 pixi 환경을 정의합니다:
환경 | 용도 |
| 핵심 런타임 + 개발 도구(pytest/ruff/mypy). MCP 서버와 모든 스크립트를 여기서 실행합니다. |
| MinerU( |
| 프로세스 내 로컬 모델 백엔드를 위한 torch/transformers를 추가합니다(첫 사용 시 모델 가중치 다운로드로 폴백). |
내장 doctor로 환경을 확인하세요:
pixi run python scripts/doctor.py모델 배포
환경('chat', 'embed', 'rerank' 클라이언트)은 OpenAI 호환 HTTP 엔드포인트를 기대합니다. scripts/serve_models.sh는 참조 모델 세트에 대해 세 개의 vLLM 인스턴스를 실행합니다:
서비스 | 모델 | 포트 |
chat | Qwen3.5-0.8B | 8101 |
embed | jina-embeddings-v5-text-small | 8102 |
rerank | jina-reranker-v3.5 | 8103 |
# point *_MODEL at your local model directories, then:
bash scripts/serve_models.shSCHOLAR_RAG_CHAT_MODEL, SCHOLAR_RAG_EMBED_MODEL, SCHOLAR_RAG_RERANK_MODEL은 필수입니다. 하나라도 설정되지 않으면 스크립트는 해당 변수를 나열하는 메시지와 함께 종료됩니다. 각 값은 로컬 HuggingFace 모델 디렉터리의 절대 경로여야 합니다. vLLM은 각 모델을 디렉터리 기본 이름과 같은 짧은 이름으로 제공하므로 클라이언트 설정은 해당 짧은 이름을 사용해야 합니다(제공되는 이름은 더 이상 전체 경로와 같지 않습니다). .env.example의 /path/to/... 자리 표시자를 그에 맞게 바꾸세요. 포트(CHAT_PORT/EMBED_PORT/RERANK_PORT)와 GPU ID는 선택 사항이며 기본값이 정상 작동합니다.
스크립트는 이 모델들에 대해 검증된 정확한 vLLM 플래그를 고정합니다(Jina embed 모델은 사용자 정의 코드 때문에 --trust-remote-code가 필요합니다. reranker는 기본 태스크로 실행되며 추가 플래그가 없습니다). 모델 로드에는 몇 분이 걸립니다. 스크립트는 세 모델이 모두 응답할 때까지 헬스 체크를 폴링합니다.
최소 환경
.env.example에서 시작하여 최소한 모델 엔드포인트를 설정하세요(serve 스크립트가 노출하는 짧은 이름을 사용하세요. 각 모델 디렉터리의 기본 이름과 같습니다):
SCHOLAR_RAG_DATA_DIR=~/.scholar-rag
SCHOLAR_RAG_QDRANT_STORAGE_DIR=~/.local/share/scholar-rag/qdrant
SCHOLAR_RAG_CHAT_BASE_URL=http://127.0.0.1:8101/v1
SCHOLAR_RAG_CHAT_MODEL=Qwen3.5-0.8B
SCHOLAR_RAG_EMBED_BASE_URL=http://127.0.0.1:8102/v1
SCHOLAR_RAG_EMBED_MODEL=jina-embeddings-v5-text-small
SCHOLAR_RAG_RERANK_BASE_URL=http://127.0.0.1:8103/v1
SCHOLAR_RAG_RERANK_MODEL=jina-reranker-v3.5임베드 모델 차원은 kb 생성 시 kb_meta.json에 기록되므로 나중에 임베딩 모델을 변경하려면 새 kb가 필요합니다.
MCP 클라이언트 설정
서버 진입점을 직접 시작하여 실행되는지 확인하세요:
pixi run scholar-rag-mcpClaude (Claude Desktop / claude CLI)
{
"mcpServers": {
"scholar-rag-mcp": {
"command": "pixi",
"args": ["run", "scholar-rag-mcp"]
}
}
}opencode
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"scholar-rag-mcp": {
"type": "local",
"command": ["pixi", "run", "scholar-rag-mcp"]
}
}
}도구
도구 | 용도 |
| 문서/청크 수와 상태를 포함한 지식 베이스 목록을 표시합니다. |
| 폴더의 모든 PDF를 새 kb에 비동기적으로 수집합니다( |
| 2단계 kb 삭제(아래 참조). |
| 단일 PDF를 기존 kb에 비동기적으로 수집합니다( |
| 문서 하나를 동기적으로 삭제합니다(Qdrant 포인트 + 카탈로그 + 파일). |
| 문서 개요: 메타데이터, 초록, 섹션 개요, 전체 크기. |
| 단일 문서 또는 단일 섹션의 페이지네이션된 전체 텍스트 읽기. |
| kb 내 문서를 페이지네이션하여 탐색합니다. |
| PubMed 스타일 문서 수준 검색(FTS + 제목/저자/저널/연도). |
| 메타데이터 필터 및 embed+rerank 점수를 사용한 의미적 청크 검색. |
| 백그라운드 작업의 상태/진행률/결과/경과 시간을 조회합니다. |
데이터 구조
<data_dir>/ # SCHOLAR_RAG_DATA_DIR, default ~/.scholar-rag
├── kbs/<kb_name>/
│ ├── kb_meta.json # dimension, chunk config, schema version
│ ├── catalog.sqlite3 # documents / authors / keywords / chunks + FTS5
│ └── documents/<doc_id>/ # source.pdf, full_text.md, sections.json
├── cache/parse/ # MinerU markdown cache, keyed by content hash
├── cache/resolver/ # annotation resolver cache, keyed by content hash
├── jobs.sqlite3 # async job history
└── bin/ # auto-downloaded Qdrant binary (v1.12.5)Qdrant 저장소는 data_dir 외부의 QDRANT_STORAGE_DIR(기본값 ~/.local/share/scholar-rag/qdrant)에 위치합니다. 로컬 파일시스템에 있어야 하며 9p/네트워크 마운트는 안 됩니다.
2단계 kb 삭제
delete_kb는 잘못된 인수로 첫 번째 호출에서 실수로 삭제하는 일이 없습니다:
delete_kb(kb="...")를 호출합니다 - kb 통계와 10분짜리confirm_token을 반환합니다.delete_kb(kb="...", confirm_token="<token>")를 호출하여 실제로 Qdrant 컬렉션, kb 디렉터리 및 해당 작업 기록을 삭제합니다.
개발
pixi run lint # ruff check src tests
pixi run typecheck # mypy src
pixi run test # pytest (unit + integration, no e2e/perf)
pixi run -e mineru pytest tests/e2e/smoke.py -v -m e2e # real end-to-end smoke
python tests/perf/bench_query.py # query latency benchmark (writes docs/perf-report.md)릴리스 노트
알려진 제한 사항과 업그레이드 지침은 docs/handoffs/release-notes-v0.1.0.md를 참조하세요.
반복할 가치가 있는 알려진 제약 사항:
Qdrant는 v1.12.5로 고정되어 있습니다 - glibc 2.35에서 실행되는 가장 높은 버전입니다. 자동 실행 시 첫 사용에 다운로드됩니다. glibc >= 2.38에서는 더 새로운 버전을 실행할 수 있지만, 이 릴리스에서 데이터 형식은 이전 kb와 순방향 호환되지 않습니다.
MinerU는 자체 pixi 환경에서 실행됩니다 - transformers 버전이 vLLM 버전과 상호 배타적이기 때문입니다. 따라서 PDF 파싱은
pixi run -e mineru를 선호합니다.MinerU 가중치(약 3.2GB)는 첫 파싱 시
~/.cache/modelscope/에 다운로드됩니다.메타데이터 제목 휴리스틱: 제목은 MinerU 마크다운이
#/##제목으로 시작할 때만 로컬에서 선택되므로, 앞에 오는## Abstract등이 제목으로 잘못 읽힐 수 있습니다. 이는 로컬 휴리스틱 메타데이터 계층에만 영향을 미칩니다. CrossRef 계층(DOI가 발견될 때 사용)은 일반적으로 이를 수정합니다.도구 디스패치: 도구에 전달된 알 수 없는 추가 인수는 거부되지 않고 조용히 무시됩니다.
9p 저장소 제한: Qdrant 저장소는 로컬 파일시스템에 있어야 합니다.
Available Tools
11 toolsadd_documentA
Asynchronously ingest a single PDF into an existing kb; returns a job_id.
| Name | Required | Description | Default |
|---|---|---|---|
| kb | Yes | ||
| pdf_path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavioral burden; it does disclose the key fact that ingestion is asynchronous and returns a job_id. However, it does not explain job lifecycle, whether the operation is idempotent, or what failure/error behavior the agent should expect.
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?
A single sentence front-loads the essential behavior and return type with no filler; every element earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with an output schema, the description is mostly sufficient, but it misses the async workflow link: an agent is told it gets a job_id but not advised to poll get_job or that ingestion completion is part of that flow.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It maps kb to an existing target and pdf_path to a single PDF, but adds little beyond the self-explanatory parameter names and leaves path format/kb identifier details unspecified.
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?
Description names a specific verb ('ingest'), object ('a single PDF'), destination ('existing kb'), and execution mode ('asynchronously'), while noting the job_id return. This clearly separates it from retrieval, removal, search, and KB-lifecycle 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 phrase 'into an existing kb' implies this is only appropriate when the target kb already exists, but there is no explicit when/when-not guidance or link to alternatives such as create_kb (if the kb doesn't exist) or get_job (to track the returned job_id).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_kbA
Asynchronously create a kb from all PDFs in a folder; returns a job_id.
| Name | Required | Description | Default |
|---|---|---|---|
| kb_name | Yes | ||
| chunk_max | No | ||
| chunk_min | No | ||
| folder_path | Yes | ||
| chunk_overlap | No | ||
| skip_existing | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral burden. It usefully discloses that creation is asynchronous and that a job_id is returned, which is essential operational information. However, it does not mention failure behavior, required access to the folder, side effects, or that the job can be tracked via get_job.
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?
A single sentence packs the core purpose, the source scope, the async nature, and the return value without any filler. Every word earns its place and the most decision-relevant information comes first.
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 the required parameters, the description plus schema names are sufficient to make a basic call. However, with 6 parameters, no annotations, and no mention of chunking semantics or job monitoring via get_job, the description is only minimally complete for a tool of this complexity.
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 only clarifies the meaning of folder_path (a folder of PDFs) and loosely implies kb_name names the KB. The chunk_max, chunk_min, chunk_overlap, and skip_existing parameters receive no semantic explanation, leaving a significant gap for a six-parameter tool.
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 ('create'), a clear resource ('kb'), a precise source scope ('all PDFs in a folder'), and a notable execution trait (async + job_id). This distinguishes it from sibling tools like add_document, which handles individual documents, and delete_kb, which removes a KB.
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 clearly implies when to use the tool: when you want to build a knowledge base from a bulk set of PDFs in a folder rather than adding documents one by one. It does not explicitly name alternatives or state when not to use it, but the folder-scoped wording is contextually strong enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_kbB
Two-phase kb deletion: preview and confirm token, else full deletion.
| Name | Required | Description | Default |
|---|---|---|---|
| kb | Yes | ||
| confirm_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It does disclose the key behavior: deletion requires a two-phase preview-and-confirm token flow. However, it omits consequences of an invalid token, irreversibility, permissions, or whether the first call actually deletes anything.
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 one short sentence with no filler and is front-loaded with the key operation. The ambiguous closing phrase 'else full deletion' slightly detracts from an otherwise efficient structure.
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 captures the essential two-phase workflow but leaves operational details unclear, such as the exact flow between preview and confirmation and the meaning of 'full deletion.' The presence of an output schema helps, but for a destructive tool with no annotations, more explicit guidance would be valuable.
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 partially does by explaining confirm_token as the confirmation mechanism, but it does not explain what kb should contain or how the token is obtained. The meaning is mostly inferred from the tool name and context.
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 operation as knowledge base deletion and names the two-phase workflow. The trailing 'else full deletion' is ambiguous about when preview vs. full deletion occurs, but the core purpose is still understandable and distinct from sibling document 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 implies a two-step usage pattern: first preview, then confirm with a token. It does not explicitly state when to use this tool over remove_document or how the phases should be sequenced, leaving some inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_documentB
Overview of a document: metadata, abstract, section outline and total character count.
| Name | Required | Description | Default |
|---|---|---|---|
| kb | Yes | ||
| doc_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 of disclosing behavior. It does disclose the output composition, which is useful, and 'get' implies a read operation. However, it does not state whether the operation is read-only, what happens on missing documents, or whether it excludes full text beyond the term 'Overview'.
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 where every phrase adds meaning. It starts with the core purpose and then lists concrete contents without any filler or repetition.
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 presence of an output schema covers return-value documentation, and the tool is relatively simple. Still, with no usage guidance and no parameter semantics in the description, an agent selecting between get_document and get_document_text has incomplete context to make a confident choice.
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 does not explain what kb or doc_id mean beyond their generic names and titles. An agent must infer that kb identifies a knowledge base and doc_id identifies the target document, which is not explicitly communicated.
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 operation, 'Overview of a document', and enumerates exactly what is returned: metadata, abstract, section outline, and total character count. This clearly distinguishes it from sibling get_document_text, which presumably returns full text.
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 explicit when-to-use or when-not-to-use guidance and does not mention alternatives such as get_document_text or search_documents. The intended use case is only implied by the word 'Overview', leaving the agent to infer which sibling tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_document_textB
Paginated reading of the full text or a single section of a document.
| Name | Required | Description | Default |
|---|---|---|---|
| kb | Yes | ||
| page | No | ||
| doc_id | Yes | ||
| section | No | ||
| page_size | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It does disclose that the operation is a read and that pagination is involved, plus the full-text-vs-section behavior. However, it omits important behavioral details such as how pagination terminates, what page_size represents, what happens for missing sections, and whether only the readable text is returned.
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?
A single, direct sentence that front-loads the primary behavior and includes the most important scope distinction. There is no filler or redundant restatement of the tool name.
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 schema and output schema provide some structural context, but the description remains thin for a 5-parameter tool with no annotations. It gives a reasonable high-level orientation, but does not cover pagination mechanics, parameter usage, or alternative tool selection, so it is not fully complete for correct 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 needed to explain the parameters, but it does not mention kb, doc_id, page, or page_size explicitly. It hints at the section parameter ('a single section') and at pagination generally, but it does not clarify parameter relationships, defaults, or constraints enough to compensate for the absent schema descriptions.
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 ('reading'), the resource ('text of a document'), and a key scope distinction ('full text or a single section'). It is specific enough to convey the core purpose, though it does not explicitly distinguish itself from the sibling get_document 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?
No guidance is given about when to use this tool versus alternatives like get_document or search_chunks. There is no mention of prerequisites, typical use cases, or when to prefer another sibling, so an agent must infer the appropriate selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_jobA
Query the status, progress and result of a background job.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must carry behavioral transparency on its own. It does convey that the operation is a read via 'Query' and that it returns status/progress/result, but it does not disclose what happens if the job is not found, whether it returns immediately, or whether it can be called repeatedly. This is adequate but not rich.
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 zero filler. Every word carries meaning, covering the verb, resource, and expected output fields.
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 simple one-parameter read tool with an output schema, the description is mostly sufficient: it states the operation's purpose and the schema handles the argument definition. It only lacks explicit guidance on when job polling is appropriate, but that is a usage nuance rather than a blocking gap.
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% and the description does not mention job_id at all, so it fails to compensate for the low coverage. However, the parameter's name ('job_id') and title ('Job Id') make its purpose self-evident, so the lack of additional meaning is a minor but real gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Query' and identifies the resource as 'a background job', then enumerates exactly what is returned: status, progress, and result. This clearly distinguishes it from sibling tools focused on documents and KBs.
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 use when a caller needs job status or progress, but it doesn't state when to use it versus alternatives, mention polling behavior, or explain its relationship to the document/KB tools. Usage context is left to the agent to infer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_documentsC
Paginated browse of documents in a kb.
| Name | Required | Description | Default |
|---|---|---|---|
| kb | Yes | ||
| page | No | ||
| sort | No | added | |
| page_size | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It only reveals pagination; it does not state read-only status, default sort order, error behavior on missing kb, or whether results are limited to metadata. Minimal behavioral context is provided.
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 with no filler, front-loading the verb 'browse'. It is appropriately short for a list operation, though it sacrifices some informational depth.
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 4 parameters, 0% schema description coverage, and no annotations, this description is too sparse to be complete. The output schema covers return values, but parameter meanings, usage context, and behavioral specifics are largely absent. 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 parameter meanings. It clarifies that kb is a knowledge base and hints at pagination, but provides no detail on 'sort', 'page', or 'page_size' semantics beyond what the schema's titles already show.
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 a specific verb ('browse') and resource ('documents in a kb'), with pagination noted. It is distinguished from siblings like get_document or search_documents by the word 'browse', though it doesn't specify whether it returns metadata or full content.
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 guidance on when to use this tool vs alternatives. The word 'browse' implies a listing use case, but there are no exclusions, prerequisites, or comparisons to search_documents or get_document.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_kbsA
List all knowledge bases with metadata and status.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output 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 states that the tool returns all KBs and includes metadata and status, which gives some idea of the operation's scope and output. It does not mention whether the operation is read-only, whether it might be paginated, or any rate limits, though 'list' inherently suggests a non-mutating read. Lacks detail on behavioral edge cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, compact sentence that front-loads the verb and object, then adds the output characteristics. Every word earns its place, and there is no redundant verbiage or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-argument list operation with an output schema, the description fully covers what the tool does, at what scope, and what the response contains. No additional context about return values is needed because the output schema exists. The tool is simple enough that nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema is empty, so there is nothing for the description to clarify on a per-parameter basis. The phrase 'all knowledge bases' adds a useful scope clarification, confirming there are no filter or pagination parameters. This meets the baseline expectation for a 0-parameter tool.
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 ('List') and resource ('knowledge bases') and clearly states the scope ('all') and the content returned ('metadata and status'). This distinguishes it from sibling tools like create_kb and delete_kb, as well as document-specific tools, without needing to inspect schemas.
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 purpose strongly implies when to use the tool: when you need an overview of all knowledge bases and their state. However, there is no explicit guidance about when not to use it or how it compares to alternatives such as get_document or search_documents. For a simple list operation, the implied usage is acceptable but not fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_documentB
Synchronously delete a document from qdrant, catalog and disk.
| Name | Required | Description | Default |
|---|---|---|---|
| kb | Yes | ||
| doc_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of behavioral disclosure. It does communicate the destructive scope and that deletion is synchronous across multiple stores, but it does not mention whether the operation is irreversible, what happens if the document does not exist, or 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?
The description is one efficient, front-loaded sentence. It conveys the operation, the synchronous behavior, and the affected storage locations without waste.
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 destructive tool with no annotations and two required parameters, the description is not complete enough. It omits parameter semantics, safety caveats, and behavior in failure cases, though an output schema is present.
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 does not explain either parameter. 'kb' and 'doc_id' are left entirely to inference from their names, with no guidance on formats, relationships, or how to obtain valid values.
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: 'delete a document' along with the concrete stores affected: qdrant, catalog, and disk. This clearly differentiates it from document retrieval/search tools and from KB-level deletes like delete_kb.
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 explicit guidance on when to use this tool versus alternatives, nor any exclusions or prerequisites. Usage is only implied by the name and the verb 'delete,' with no context about preparing for the operation or handling the irreversibility.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_chunksA
Semantic search over chunk bodies of a kb with metadata filters, embedding and rerank scores.
| Name | Required | Description | Default |
|---|---|---|---|
| kb | Yes | ||
| query | Yes | ||
| top_k | No | ||
| min_score | No | ||
| metadata_filter | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden, and it discloses that the operation is semantic, filterable by metadata, and produces embedding and rerank scores. It does not overstate side effects; search implies a read operation. It could add detail on how filters and scores interact, but the core behavior is clearly conveyed.
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?
A single dense sentence that leads with the action and target and ends with scoring detail. There is no filler or repetition of schema field titles.
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 presence of an output schema covers return values, but the description still leaves parameter semantics and the relationship to search_documents implicit. For a straightforward search operation the description is adequate, yet it has clear gaps around top_k/min_score and when to use this 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 for five otherwise undocumented parameters. Only 'metadata filters' maps directly to a parameter; kb/query semantics are implicit, and top_k/min_score are not explained at all.
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 ('search'), resource ('chunk bodies of a kb'), and retrieval type ('semantic'), with metadata filtering noted. This clearly distinguishes it from sibling search_documents, which operates at document level.
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 'semantic search over chunk bodies' implies this is the right tool when an agent needs similarity-based retrieval over chunks, in contrast to sibling document-level tools. However, it never explicitly states when to prefer this tool over search_documents or when not to use it, so usage guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_documentsC
Document-level PubMed-style search with optional FTS query and metadata filters.
| Name | Required | Description | Default |
|---|---|---|---|
| kb | Yes | ||
| page | No | ||
| query | No | ||
| title | No | ||
| authors | No | ||
| journal | No | ||
| year_to | No | ||
| page_size | No | ||
| year_from | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It states search scope and optional filters but does not explain whether the operation is read-only, how filters combine, how pagination behaves, or what query syntax is expected. 'PubMed-style' hints at behavior but is not explicit.
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 filler. Every phrase contributes to the core purpose or key capability, making it easy to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 9 parameters, no annotations, and zero schema descriptions, one sentence is not enough. The output schema may cover return values, but the description omits query syntax, filter semantics, pagination behavior, and sibling selection cues, leaving significant gaps for correct 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 compensate. It adds useful meaning by labeling 'query' as an FTS query and grouping title, authors, journal, and year fields as metadata filters. However, it does not clarify query syntax, filter combination logic, or the meaning of kb/page/page_size beyond their 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 identifies 'search' as the action and 'documents' as the resource, and 'document-level' helps separate it from chunk-level searching. It does not explicitly name sibling alternatives such as list_documents, but the core purpose 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 description implies use for finding documents via full-text query and metadata filters, but it offers no explicit when-to-use guidance, no exclusions, and no comparison with search_chunks or list_documents. An agent is left to infer when this tool is the right choice.
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.
11 tool updates
v0.1.0- First observed
add_document - First observed
create_kb - First observed
delete_kb - First observed
get_document - First observed
get_document_text - First observed
get_job - First observed
list_documents - First observed
list_kbs - First observed
remove_document - First observed
search_chunks - First observed
search_documents
TDQS
Scored across 11 tools
Each tool targets a distinct resource and action: KB-level, document-level, and chunk-level operations are cleanly separated. get_document versus get_document_text, and search_documents versus search_chunks, are differentiated by granularity and description.
All tools follow a clear snake_case verb_noun pattern (get, add, remove, search, list, create, delete). The only slight abbreviation is list_kbs, but it does not break the pattern or create ambiguity.
At 11 tools, the surface is well-scoped for a RAG/knowledge-base server: KB management, document management, retrieval, and job status. Each tool corresponds to a distinct operation needed for the workflow.
The set covers the full lifecycle: KB create/list/delete, document add/get/list/remove, text reading, document- and chunk-level search, and async job tracking. There are no obvious dead ends; asynchronous operations are paired with get_job for status and results.
Maintenance
Related MCP Connectors
Personal knowledge base MCP server with semantic search, auto-categorization, metadata extraction
Ingest, manage, and retrieve documents for RAG-powered AI applications
Cloud or self-hosted knowledge for AI agents: hybrid search, reranking, GraphRAG, scoped MCP tools.
- docs2mcpOAuthcom.docs2mcp
Query your own PDFs and documents from any MCP client. Every answer cites the page it came from.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceA local academic research assistant that indexes PDFs into a searchable vector library and exposes MCP tools for semantic search, claim extraction, contradiction detection, and multi-step research synthesis.-
- FlicenseNot gradedqualityDmaintenanceIndexes PDF documents into Qdrant and exposes semantic search as MCP tools, enabling RAG-based interactions with your documents.-
- FlicenseNot gradedqualityDmaintenanceEnables users to build and query a private knowledge base by uploading documents, which are embedded and stored locally, then accessible via MCP for semantic search and retrieval.-
- FlicenseAqualityBmaintenanceEnables semantic search across personal PDF paper collections with page-level citations, allowing users to query their library from any MCP-capable client.9-