Skip to main content
Glama

🧠 Recall β€” a local, private knowledge-base MCP server

CI Python MCP License: MIT

Recall turns a folder of your own notes and documents into a searchable knowledge base that any AI assistant can use. It is a Model Context Protocol (MCP) server: connect it to Claude Desktop, Claude Code, or any MCP client, and the assistant can search, read, and add to your notes through well-defined tools.

It uses semantic search powered by local embeddings, so it finds passages by meaning, not just matching keywords β€” and it runs entirely on your machine. No API key, no cloud, your documents never leave your device.


Why this project is interesting

  • Retrieval-Augmented Generation (RAG) done locally β€” chunking, embeddings, and cosine-similarity retrieval, the core of modern AI knowledge systems.

  • Hybrid retrieval β€” fuses semantic and keyword results with Reciprocal Rank Fusion (RRF), the technique production search systems use.

  • Model Context Protocol β€” exposes capabilities as tools an LLM can call, the emerging standard for connecting AI assistants to real systems.

  • Privacy-first β€” semantic search runs on-device with a small embedding model; nothing is sent to a third party.

  • Graceful degradation β€” if the embedding model can't load, it automatically falls back to keyword search instead of breaking.

Related MCP server: agrasandhany

See it in action

Ask Claude (with Recall connected) "search my notes for how to undo a git commit" β€” it calls the search_documents tool and answers grounded in git-cheatsheet.md, entirely on your machine.

See the difference: keyword vs. semantic

Ask "how do I undo a commit?" against a small dev knowledge base:

Search mode

Top result

Why

Keyword

the doc that literally contains the words "undo a commit"

matches exact words

Semantic

git-cheatsheet.md β†’ git revert makes a new commit that undoes an earlier one

matches meaning

Semantic search finds the genuinely useful answer even though the words don't overlap. That is the whole point of embeddings.

Retrieval quality (measured)

A small labelled eval (10 paraphrased queries over the sample docs) compares the three search modes. Semantic beats keyword clearly, especially at recall@1:

Mode

recall@1

recall@3

Keyword

40%

80%

Semantic

80%

90%

Hybrid

60%

90%

Reproduce it with python eval/run_eval.py. The corpus is small and topically overlapping, so treat the numbers as illustrative. (Pure semantic edges out hybrid here; hybrid tends to win when exact keyword matches matter β€” codes, names, error strings.) The harness is the real point: retrieval quality is measured, not assumed.

What the AI can do (the MCP tools)

Tool

What it does

search_documents(query, limit, mode)

Find the most relevant passages. mode can be auto, semantic, keyword, or hybrid.

get_document(source)

Return the full text of one document so the assistant can read or summarise it.

list_sources()

List the documents currently loaded and the active search mode.

add_note(title, content)

Save a new note into the knowledge base; it becomes searchable immediately.

How it works

        Your documents (.md / .txt / .pdf)
                 β”‚
                 β–Ό
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚  DocumentStore     β”‚   1. split each file into paragraph "chunks"
        β”‚  (recall/store.py) β”‚   2. embed every chunk into a vector (local model)
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                 β”‚  query
                 β–Ό
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚  Semantic search   β”‚   embed the query, rank chunks by cosine similarity
        β”‚  (or keyword)      β”‚   (falls back to keyword search if no model)
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                 β”‚  tools
                 β–Ό
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”        MCP (stdio / JSON-RPC)
        β”‚  FastMCP server    β”‚ ◀───────────────────────────▢  Claude Desktop,
        β”‚  (recall/server.py)β”‚                                 Claude Code, ...
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
  1. Chunk β€” documents (Markdown, plain text, or PDF) are split on blank lines into passages, with each Markdown heading kept attached to the text it introduces, so results land on a precise, self-contained passage.

  2. Embed β€” each chunk is turned into a vector with a local fastembed model (bge-small-en-v1.5, 384-dimensional vectors).

  3. Retrieve β€” a query is embedded and compared to every chunk by cosine similarity; the closest chunks win.

  4. Serve β€” the FastMCP server exposes search/read/write as MCP tools over stdio, so any MCP client can use them.

Quickstart

Requires Python 3.10+.

# 1. Clone and enter the project
git clone https://github.com/jaswanthsurya007-source/recall-mcp.git
cd recall-mcp

# 2. Create and activate a virtual environment
python -m venv .venv
# Windows (PowerShell):
.venv\Scripts\Activate.ps1
# macOS / Linux:
source .venv/bin/activate

# 3. Install
pip install -e .

# 4. Try a search from Python
python -c "from recall.store import DocumentStore; s=DocumentStore('data/documents'); print([r.chunk.source for r in s.search('how do I undo a commit', 1)])"

The first run downloads the embedding model (~66 MB) once, then caches it.

Behind a corporate proxy?

Recall uses truststore to trust your operating system's certificates automatically, so it works on networks that inspect TLS traffic (common at large companies) without extra configuration.

Connect it to Claude Desktop

Add Recall to your claude_desktop_config.json (Settings β†’ Developer β†’ Edit Config):

{
  "mcpServers": {
    "recall": {
      "command": "/absolute/path/to/recall-mcp/.venv/bin/python",
      "args": ["-m", "recall.server"],
      "env": {
        "RECALL_DOCS_DIR": "/absolute/path/to/recall-mcp/data/documents"
      }
    }
  }
}

On Windows, use the full path to python.exe and escape backslashes, e.g. "C:\\path\\to\\recall-mcp\\.venv\\Scripts\\python.exe".

Restart Claude Desktop, and you'll see Recall's tools available. Ask it things like "Search my notes for how to undo a git commit" or "Save a note titled 'Meeting' with these action items…".

Use your own documents

Point Recall at any folder of .md, .txt, or .pdf files:

# macOS / Linux: set RECALL_DOCS_DIR to your own notes folder
RECALL_DOCS_DIR="/path/to/my/notes" python -m recall.server
# Windows (PowerShell)
$env:RECALL_DOCS_DIR = "C:\path\to\my\notes"; python -m recall.server

The data/documents/ folder ships with a few sample notes so you can try it immediately.

Running the tests

pip install -e ".[dev]"
pytest -q

The test suite runs fully offline (keyword mode), so it needs no model download.

Project structure

recall-mcp/
β”œβ”€β”€ .github/workflows/ # CI: ruff + pytest on every push
β”œβ”€β”€ recall/
β”‚   β”œβ”€β”€ server.py      # FastMCP server: defines the MCP tools
β”‚   β”œβ”€β”€ store.py       # load β†’ chunk β†’ search (semantic, keyword, hybrid)
β”‚   └── embeddings.py  # local embedding model wrapper (fastembed)
β”œβ”€β”€ data/documents/    # sample knowledge base (.md and .pdf)
β”œβ”€β”€ tests/             # offline pytest suite (+ fixtures/)
β”œβ”€β”€ eval/              # retrieval-quality eval (recall@k)
β”œβ”€β”€ pyproject.toml     # packaging + tooling config
β”œβ”€β”€ requirements.txt
└── LICENSE

Design notes

  • Why local embeddings? Privacy and zero cost. fastembed uses ONNX runtime rather than PyTorch, so installs are small and inference is fast on CPU.

  • Why chunk by paragraph? It is simple and transparent, and it makes results land on a focused passage. A future version could use overlapping token windows.

  • Why a fallback to keyword search? A tool should never hard-fail. If the model can't be downloaded, search still works β€” just less cleverly.

  • Re-indexing on write is a full reload for clarity; at larger scale you would embed only the newly added chunks.

Roadmap

  • Retrieval-quality eval harness (recall@k)

  • Hybrid search (Reciprocal Rank Fusion of semantic + keyword)

  • PDF document support

  • Persist embeddings to disk so startup is instant on large corpora

  • Support HTML documents

  • Optional LLM-generated summaries via the Claude API

  • Expose documents as MCP resources, not just tools

License

MIT

Available Tools

4 tools
add_noteA

Save a new note to the knowledge base and index it immediately.

Args: title: A short title; also used to name the file. content: The note body (plain text or Markdown).

Returns: A confirmation with the created document's source name.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYes
contentYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the burden. It discloses that notes are indexed immediately and returns a confirmation with source name. However, it doesn't mention any side effects, idempotency, or access restrictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured with purpose, arguments, and returns. Every sentence adds value, and the most critical information is front-loaded in the first sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple create tool with two parameters and an output schema, the description covers the key aspects: what it does, parameter meanings, and return value. It lacks detail on uniqueness or overwrite behavior, but those are not essential.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage, but the description compensates by explaining that 'title' is also used for naming the file and that 'content' accepts plain text or Markdown. This adds significant meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'save' and 'index' and the resource 'note' and 'knowledge base'. It distinguishes itself from sibling tools which are all retrieval-oriented (get_document, list_sources, search_documents).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not explicitly state when to use this tool versus alternatives. However, the action of creating a note is self-evident given the sibling tools, so usage is implied but not clearly guided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_documentA

Return the full text of one document by its source name.

Use list_sources first to see valid names. The caller can then read or summarise the returned text.

ParametersJSON Schema
NameRequiredDescriptionDefault
sourceYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. Only states basic behavior (returns full text). Lacks details on error handling, permissions, side effects, or what happens if source does not exist.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences with no fluff. First sentence states purpose, second provides usage guidance. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given output schema exists, description need not detail return structure. However, it misses error conditions and does not address potential limitations (e.g., what if multiple documents share a source name).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% for parameter 'source', but description adds meaning by linking it to list_sources (source names). Does not specify format, case sensitivity, or validation rules.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Return', the resource 'full text of one document', and the identifier 'by its source name'. It distinguishes from siblings like list_sources (lists names) and search_documents (search, not retrieval).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly instructs to use list_sources first to get valid names, and suggests actions on the result (read or summarise). Provides clear workflow context but does not explicitly state when not to use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_sourcesB

List the documents in the knowledge base and the active search mode.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description carries the full burden. It only states the action but does not disclose traits like read-only nature, whether it lists all documents without filters, pagination behavior, or any side effects. For a simple list tool, this is minimal disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence of 10 words, extremely concise with no wasted text. For a no-parameter tool, this is appropriately sized and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is low complexity with no parameters and an output schema exists (though not detailed here). The description is adequate but could be more complete by mentioning that it lists all documents (no filtering) or clarifying return format. Given the output schema, the description is minimally sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are no parameters (schema coverage 100%), so the description does not need to add param info. Baseline for 0 params is 4. The description is clear about what the tool does, which is sufficient.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool lists 'documents in the knowledge base' and 'the active search mode', specifying the verb (list) and resources. However, 'active search mode' is vague and not defined further, and it does not distinguish from siblings like search_documents which also deals with documents.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives such as search_documents (for searching) or get_document (for a specific document). The agent is left to infer that this tool should be used to get an overview, but exclusions or context are missing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_documentsA

Search the knowledge base for passages relevant to a query.

Args: query: What to look for, in natural language or keywords. limit: Maximum number of passages to return (1-50, default 5). mode: "auto" (semantic if available, else keyword), "semantic", or "keyword". Use "keyword" to force exact-word matching.

Returns: The most relevant passages, each labelled with its source and score.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
limitNo
modeNoauto

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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 clearly explains the return format (passages with source and score) and the behavior of each mode. However, it does not explicitly state that the operation is read-only or mention any side effects, permissions, or rate limits, which are not critical for a search tool but would add completeness.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very concise: a single sentence for purpose, a bullet-like list for parameters, and a sentence for the return format. Every sentence provides essential information. It is front-loaded with the key action and then details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has three parameters, no annotations, and an output schema, the description is complete. It explains all parameters, the default behavior for mode and limit, and what the response contains (passages with source and score). The output schema existence means the description does not need to detail the return structure beyond that.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% coverage (no parameter descriptions in the JSON schema), so the description must fully compensate. It does so by explaining each parameter in detail: query (natural language or keywords), limit (1-50, default 5), and mode (three options with behavior descriptions). This adds significant meaning beyond the basic types and defaults in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states this tool searches the knowledge base for passages relevant to a query, using a specific verb and resource. It distinguishes itself from siblings (add_note, get_document, list_sources) by being a search tool that returns multiple passages, rather than adding a note, getting a single document, or listing sources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for finding relevant passages but does not explicitly state when to use this tool versus alternatives or when not to use it. There is no mention of prerequisites or context that would help an agent decide between search_documents and its siblings.

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. Dates show when Glama detected each change.

  1. 4 tool updatesv0.1.0
    • First observedadd_note
    • First observedget_document
    • First observedlist_sources
    • First observedsearch_documents

TDQS

A3.7/5.0
Disambiguation5/5

Each tool has a clearly distinct purpose: adding notes, retrieving a specific document, listing sources, and searching. No overlap or ambiguity.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern with snake_case: add_note, get_document, list_sources, search_documents. The pattern is uniform and predictable.

Tool Count4/5

4 tools is slightly below average but still reasonable for a focused knowledge base server. It covers core operations without being too sparse or excessive.

Completeness2/5

The tool set provides create, read, and search capabilities but lacks update and delete operations. This is a significant gap for managing a knowledge base, as agents cannot modify or remove notes.

Maintenance

ActivityStale
ResponsivenessUnresponsive

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

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    Turns your Obsidian vault into an MCP-enabled workspace with tools for reading/writing notes, managing folders, running semantic searches, and maintaining long-term memoryβ€”all while keeping data local to your vault.
    180,426
    154
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Turn any folder into a searchable knowledge base for AI, exposed via MCP.
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI tools to query a user's private, locally stored memories (notes, documents) with source citations, using the MCP protocol.
    17
    MIT

Latest Blog Posts

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/jaswanthsurya007-source/recall-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server