context-retrieval
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@context-retrievalIndex /docs/report.pdf and tell me what it says about retention policy"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Context Retrieval System Powered by RAG and MCP Server
A hybrid context-retrieval system built on the Model Context Protocol (MCP) and Retrieval-Augmented Generation (RAG). It exposes multimodal PDF parsing and a fully local vector-search pipeline as MCP tools, so AI agents (Claude Desktop, Cursor, or any MCP-compatible client) can fetch real-time document context on demand instead of relying on pre-loaded, static knowledge.
Highlights
MCP-native — 7 JSON-in/JSON-out tools served over stdio (local) or streamable-HTTP (network), built on the official
mcpPython SDK.Multimodal parsing — PyMuPDF extracts structured text and base64-encoded images; Camelot (lattice/stream, with a PyMuPDF fallback) extracts complex tables straight into LLM context windows.
Local RAG pipeline — LangChain
RecursiveCharacterTextSplitterchunking, on-device fastembed embeddings (BGE-small, ONNX), and a FAISS vector store. No external embeddings API, no per-query cost, no data leaving the machine.Sub-linear search — cosine similarity over L2-normalised vectors; above a configurable threshold the store switches to an IVF (inverted-file) index, keeping query latency approximately O(log N) as the corpus grows.
Persistent & re-entrant — the FAISS index, raw vectors and chunk metadata persist to disk; re-indexing a changed document replaces its chunks (content-hash doc IDs).
Safe by default — every tool path is validated (null bytes, existence, extension, optional allow-list roots) and returns structured JSON errors instead of crashing the server.
Containerized + CI — Dockerfile (with the embedding model pre-baked) and GitHub Actions running lint, the full test suite including end-to-end MCP protocol tests, and a containerized smoke test.
Related MCP server: PDF Indexer MCP Server
Setup
git clone https://github.com/ESPChong/context-retrieval-system-RAG-MCP.git
cd context-retrieval-system-RAG-MCP
python3.12 -m venv .venv
.venv/bin/pip install -r requirements.txt
.venv/bin/pip install -e . --no-deps # optional: `python -m context_retrieval` from anywhere
# stdio mode is what Claude Desktop / Cursor launch:
.venv/bin/python -m context_retrievalThe embedding model (~35 MB) downloads from Hugging Face once and is cached locally; after that the system runs fully offline.
Try the pipeline without any MCP client:
.venv/bin/python scripts/demo.pyTool reference
Tool | Purpose | Key parameters |
| Per-page structured text + PDF metadata |
|
| Embedded images as base64 PNG + geometry |
|
| Tables via Camelot lattice/stream, PyMuPDF fallback; |
|
| Chunk → embed (local) → FAISS, persists the store |
|
| Top-k semantic search with scores + source/page provenance |
|
| Store status: docs, chunks, dimension, index type | — |
| Drop all indexed documents | — |
Connect an MCP client
{
"mcpServers": {
"context-retrieval": {
"command": "/absolute/path/to/context-retrieval-system-RAG-MCP/.venv/bin/python",
"args": ["-m", "context_retrieval"],
"env": {
"CONTEXT_RETRIEVAL_DATA_DIR": "/absolute/path/to/context-retrieval-system-RAG-MCP/data",
"CONTEXT_RETRIEVAL_ALLOWED_ROOTS": "/absolute/path/to/your/pdfs"
}
}
}
}(ready-to-edit copy in docs/claude-desktop-config.json)
Same mcpServers object; copy in docs/cursor-mcp.json.
# stdio mode (pipe JSON-RPC, e.g. from an MCP host):
docker build -t context-retrieval .
docker run -i --rm -v "$PWD/docs:/docs" context-retrieval
# network mode (streamable-http on http://localhost:8000/mcp):
docker compose up --buildOnce connected, just ask: "Index /docs/report.pdf and tell me what it says about retention policy." — the client will chain index_document → search_context (or the extraction tools) automatically.
Configuration (env vars)
Variable | Default | Meaning |
|
| Where |
|
| Local fastembed model (384-dim) |
|
| LangChain splitter parameters |
|
| Vectors above this switch Flat → IVF index |
|
| IVF clusters probed per query |
| (unrestricted) | Comma-separated directory allow-list for tool paths |
| images 10 / 400 KB / tables 30 / rows 200 / pages 500 | Context-window guard rails |
Testing
.venv/bin/python -m pytest -v19 tests, including end-to-end MCP protocol tests that spawn the real server over stdio and exercise the full handshake → tool-call → RAG-roundtrip path. A deterministic 3-page sample PDF (prose / ruled table / embedded image) is generated by the suite itself.
.venv/bin/python scripts/make_sample_pdf.py my-sample.pdf # inspect it yourselfDesign notes
Why local embeddings? Removing the external embeddings API eliminates per-query cost and network latency, and keeps document content on the machine. fastembed runs quantized-ready ONNX models — a 384-dim BGE-small that embeds ~2,600 chunks/sec on a laptop CPU.
What "≈ O(log N)" means here. Flat exact search scans all N vectors. The IVF index partitions the space into
nlist ≈ 4·√Nclusters and compares the query against onlynprobeof them plus their members — sub-linear, logarithmic-style growth in practice, at the cost of a small recall trade-off tunable vianprobe.Chunk provenance. Chunking runs per page, so every retrieved fragment carries
page+source, letting the host model cite where an answer came from — the antidote to hallucinated citations.Graceful degradation. Camelot's lattice mode needs Ghostscript; when it is missing (thin environments),
autosilently falls back to stream, then to PyMuPDF's detector, and table extraction still succeeds.
Available Tools
7 toolsextract_document_imagesA
Extract embedded images from a PDF as base64 PNG (PyMuPDF). Each image carries page, width, height and byte size. Set include_data=false to inventory images without transferring payloads; oversized images return metadata only.
| Name | Required | Description | Default |
|---|---|---|---|
| pages | No | ||
| pdf_path | Yes | ||
| max_images | No | ||
| include_data | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It reveals output format, per-image metadata, the effect of include_data=false, and the oversized-image fallback behavior. This is substantial transparency, though it does not mention error behavior or side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. The core action and output format are front-loaded, and the conditional behavior of include_data is stated efficiently. Every sentence contributes useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the primary behavior and return metadata well, and an output schema exists to define the return shape. However, the semantics of pages and max_images are left completely undocumented, and there is no guidance for choosing among extraction siblings. This leaves meaningful 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 for all parameters. It only clarifies include_data semantics; pages and max_images remain unexplained in both schema and description. This leaves an agent to guess the expected format or behavior of those parameters.
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: extract embedded images from a PDF, and specifies the output format as base64 PNG. It is clearly distinguished from sibling tools like extract_document_text and extract_document_tables without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for image extraction and gives parameter-level guidance for include_data=false, but it does not explicitly state when to choose this tool over siblings or provide exclusion criteria. The context is clear enough for an agent, but explicit routing guidance is missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_document_tablesA
Extract tabular data from a PDF (Camelot lattice/stream with a PyMuPDF fallback; flavor='auto' picks the first strategy that finds tables). Returns JSON with rows, columns and CSV per table.
| Name | Required | Description | Default |
|---|---|---|---|
| pages | No | ||
| flavor | No | auto | |
| pdf_path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral burden. It discloses the multi-strategy pipeline (Camelot lattice/stream with PyMuPDF fallback), explains what flavor='auto' does, and explicitly states the return structure (rows, columns, CSV per table). It does not discuss failure modes, but it provides meaningful behavioral context beyond the schema.
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?
Two sentences, front-loaded with the primary action, and every clause adds useful information. No redundant filler or restating 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 description covers extraction strategy and output format, and an output schema is present so return details are already structurally defined. The main gap is that the pages parameter behavior remains unspecified, and there is no guidance on what happens when no tables are found. Sufficient for default usage but incomplete for full parameter-level decision-making.
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 all three parameters. It clearly explains flavor's behavior and pdf_path is self-evident from the tool's purpose. However, pages is entirely undocumented: there is no hint that it expects a string like '1-3,5' or what passing null means. Partial compensation, not full.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening verb phrase 'Extract tabular data from a PDF' is specific, names the resource (PDF) and the exact kind of content (tabular data), and is immediately distinguishable from siblings like extract_document_text and extract_document_images. The added method/return mentions reinforce rather than obscure purpose.
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: whenever the agent needs tabular data from a PDF. However, it never explicitly contrasts with extract_document_text or extract_document_images, nor gives exclusion criteria (e.g., use extract_document_text for non-tabular content). The usage context is clear but the alternative-selection guidance is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_document_textA
Extract structured text from a PDF, page by page (PyMuPDF). Returns JSON: page count, document metadata, and each page's text with 1-based page numbers — use pages='1-3' or '1,5' to limit output.
| Name | Required | Description | Default |
|---|---|---|---|
| pages | No | ||
| pdf_path | Yes |
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. It discloses the implementation (PyMuPDF), the exact JSON return structure (page count, document metadata, per-page text with 1-based page numbers), and the page-range syntax. It does not mention edge cases like scanned PDFs or encryption, but for a read-only extraction tool this is solid coverage.
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?
Two sentences with no filler. The action is front-loaded, followed by output format and the one non-obvious parameter usage. Every sentence 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 simple two-parameter tool with an output schema, the description covers the core purpose, the return structure, and parameter syntax. It does not mention error scenarios or ideal use cases relative to siblings, but nothing essential is missing for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description must compensate. It explicitly documents the pages parameter with concrete syntax ('1-3' or '1,5'), while pdf_path is self-explanatory given the phrase 'from a PDF'. The description adds meaningful context that the raw schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Extract structured text from a PDF') and adds clarifying detail ('page by page', 'Returns JSON', '1-based page numbers'). The term 'text' clearly differentiates it from sibling tools focused on images and tables, so an agent can tell them apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear instruction on the pages parameter ('use pages=\'1-3\' or \'1,5\' to limit output') but does not explicitly state when to prefer this tool over siblings like extract_document_images or extract_document_tables. Tool-selection guidance is only implied by the word 'text' and the sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
index_documentA
Index a PDF into the local RAG store: PyMuPDF text -> LangChain chunking -> local fastembed embeddings -> FAISS. Call once per document, then use search_context for queries. Re-indexing a changed file replaces its chunks (set replace=false to append).
| Name | Required | Description | Default |
|---|---|---|---|
| replace | No | ||
| pdf_path | Yes | ||
| chunk_size | No | ||
| chunk_overlap | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral burden and does well: it discloses the full processing pipeline, persistent store mutation, and re-indexing replacement vs append semantics. Could mention failure behavior or side effects, but the core mutation behavior is transparent.
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?
Three dense sentences with no fluff. The pipeline is front-loaded, usage comes next, and the replace/append caveat is at the end. Every sentence 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?
Covers the main workflow, post-index search routing, and the critical replace behavior. Given an output schema exists, return values need no explanation. Minor gaps remain around chunk_size and chunk_overlap semantics, but the description is largely sufficient 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 only explains 'replace' semantics; the pipe path is inferable from the name, but chunk_size and chunk_overlap receive no meaningful description beyond the vague 'LangChain chunking' reference.
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, and pipeline ('Index a PDF into the local RAG store') and describes the transformation chain from PyMuPDF text to FAISS. Clearly distinguishes indexing from sibling tools like extract_document_text and search_context.
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 clear usage context: call once per document, then search_context for queries, with replace/append behavior. Does not explicitly enumerate when to prefer extraction siblings, but the pipeline and search handoff make the intended workflow obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
index_infoA
Report vector store status: documents, chunk count, dimension, FAISS index type.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the full burden of behavioral disclosure. The verb 'Report' and the listed fields strongly imply a read-only status operation with no side effects, which is adequate for a zero-parameter tool. However, it does not explicitly state read-only behavior or what happens if the index does not exist yet.
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 a colon-separated list of report contents. Every word contributes information, and there is no redundant filler or repetition 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?
Given the tool's low complexity, zero parameters, and presence of an output schema, the description is complete enough for an agent to invoke it correctly. It names exactly what status fields will be reported, and nothing else is required.
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 input schema properties object is empty, so there are no parameter semantics for the description to clarify. The zero-parameter baseline of 4 applies because the description needs no additional parameter detail.
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 'Report' with the resource 'vector store status' and enumerates concrete outputs: documents, chunk count, dimension, and FAISS index type. This clearly differentiates it from siblings like reset_index, index_document, and search_context, which perform different operations.
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 is provided, and no alternative tools are named. The intended usage is only implied: it is the obvious status-check tool among the siblings, but there is no suggestion about when to invoke it, such as before indexing or after a reset.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reset_indexA
Drop every indexed document and clear the persisted vector store.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully carries the burden of disclosing behavior, and it does so clearly: the tool destroys all indexed documents and clears the persisted vector store. It does not explicitly mention irreversibility or downstream effects on search_context/index_info, but the destructive scope is explicitly and strongly stated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler. Every word contributes to the agent's understanding of the tool's destructive effect.
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-parameter destructive reset operation, the description is complete: it states exactly what is dropped and what is cleared, and the presence of an output schema covers return-value expectations. Sibling tool names provide enough surrounding context to situate this operation within the broader indexing workflow.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool accepts zero parameters, so there is no parameter semantics burden on the description. The schema already trivially covers 100% of parameters, and the description adds a clear conceptual model of what the parameterless invocation accomplishes.
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 ('Drop') and resource ('every indexed document' and 'persisted vector store'), making the tool's destructive reset purpose unmistakable. It clearly distinguishes reset_index from siblings like index_document, search_context, and index_info, which operate on or query the index rather than clearing it.
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 wording strongly implies this is the full-reset tool: 'Drop every indexed document' is unambiguous. However, the description never explicitly states when to choose reset_index over alternatives, nor does it warn that this should not be used for selective deletions or before confirming the loss of all indexed data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_contextA
Semantic search over indexed documents (FAISS + local embeddings). Returns the top-k chunks ranked by cosine similarity with source file and page provenance — feed these to your answer generation. Optional source_filter narrows hits to one document.
| Name | Required | Description | Default |
|---|---|---|---|
| k | No | ||
| query | Yes | ||
| source_filter | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral disclosure burden. It explains the ranking methodology (cosine similarity), the output provenance (source file and page), and the effect of the optional filter, which gives a solid sense of expected behavior for a read-only search tool.
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 two sentences with no filler. The first sentence front-loads the core capability, output format, and ranking method, while the second adds the optional filter and downstream use. Every phrase 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 moderate-complexity tool with an output schema present, the description is complete: it states what the tool does, what it returns, how results are ordered, and the optional filter. It also gives a practical hint to feed results into answer generation, which covers the intended integration context adequately.
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: 'top-k' clarifies the k parameter's role, and source_filter is explicitly explained as narrowing hits to one document. The query parameter is left implicit, but its purpose is intuitively clear from the 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 states the tool's function: semantic search over indexed documents using FAISS and local embeddings, returning top-k chunks with source file and page provenance. This distinguishes it from sibling tools like extract_document_text and index_document, which handle extraction and indexing rather than search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context: the returned chunks should be fed to answer generation, indicating it is the retrieval tool for grounding answers. It does not explicitly say when not to use it or compare directly to extract_document_text, but the intended use case is evident from the phrasing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool targets a distinct operation: reset/index/status/retrieval are clearly separated from the three extraction tools, which differ by output type (text/images/tables). Even though extract_document_text and index_document both process PDFs, one returns extracted text while the other persists chunks into the vector store, so an agent can choose unambiguously.
Most tools follow a verb_noun pattern (reset_index, index_document, search_context), and the extract_document_* family is perfectly consistent. index_info is slightly off-pattern because it reads as a noun phrase rather than verb + object, but this is a minor deviation.
Seven tools is a well-scoped size for a PDF extraction and RAG retrieval server. Each tool earns its place and there is no redundant duplication.
The core workflow is covered: documents can be extracted, indexed, searched, and the entire index can be reset. The main gap is the lack of a way to delete a single document from the index, with only reset_index for the whole store, and no explicit list of indexed file names.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
OCR, transcription, file extraction, and image generation for AI agents via MCP.
Generate and read PDFs for AI agents: a generate_pdf and a read_pdf tool, priced per document.
Hosted MCP server: convert PDFs to clean, LLM-ready Markdown with tables, formulas and OCR.
Your org's AI agents, tasks, runs, search, and brain files as MCP tools and resources.
Related MCP Servers
- AlicenseBqualityAmaintenanceEmpowers AI agents to securely read and extract information (text, metadata, page count) from PDF files within project contexts using a flexible MCP tool.1301906MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to download, index, and semantically search PDF research papers using 8 MCP tools.2GPL 3.0
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to search, deep-read, and build knowledge bases from Markdown, PDF, DOCX, and PPTX documents via MCP tools for retrieval, document navigation, and ingestion.50627MIT
- FlicenseNot gradedqualityCmaintenanceIndexes PDF documents into Qdrant and exposes semantic search as MCP tools, enabling RAG-based interactions with your documents.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/ESPChong/context-retrieval-system-RAG-MCP'
If you have feedback or need assistance with the MCP directory API, please join our Discord server