Skip to main content
Glama

mcp-ragdown

An MCP server over a folder of Markdown files. Point it at the folder and it embeds every section into a local LanceDB index and keeps that index in sync as files change. Agents get search tools, and a Claude Code hook adds related notes to each prompt automatically. The tool and hook layout follows mcp-zeromem, but the memory here is your Markdown files, not conversation turns.

Everything runs locally: the default embedder is bge-small-en-v1.5 on ONNX Runtime. The Docker image has the model baked in; outside Docker it is downloaded once (about 35 MB) on first start.

Quick start

docker-compose.yml:

services:
  ragdown:
    image: vantreeseba/mcp-ragdown:latest
    ports:
      - '3300:3000'
    volumes:
      - ~/notes:/docs          # your Markdown folder; add :ro and RAGDOWN_READ_ONLY=true to forbid writes
      - ragdown-data:/data     # the index, so restarts only diff
    environment:
      RAGDOWN_TOKEN: ${RAGDOWN_TOKEN}
    restart: unless-stopped

volumes:
  ragdown-data:
export RAGDOWN_TOKEN=$(openssl rand -hex 32)   # keep it; clients need it too
docker compose up -d
curl localhost:3300/api/status                  # "ready": true, and the file and chunk counts

claude mcp add --transport http ragdown http://localhost:3300/mcp \
  --header "Authorization: Bearer $RAGDOWN_TOKEN"

The first index of a large folder takes minutes; searches answer from what is indexed so far. For the context hook against the container, see Claude Code setup. Images are published for linux/amd64 and linux/arm64 to Docker Hub and ghcr.io/cubicecho/mcp-ragdown.

Without Docker

npm install
export RAGDOWN_DOCS_DIR=~/notes

node src/cli.ts index                         # first index; later starts only diff
node src/cli.ts search "how do I restore the database"
node src/cli.ts stats

Requires Node 26+, which runs the TypeScript directly.

Related MCP server: Markdown Memory Context MCP Server

Claude Code setup

Against the container

The MCP server is the claude mcp add --transport http line above. The hook talks to the container over HTTP when RAGDOWN_URL is set, and then loads nothing locally, but it still needs this checkout (no npm install required for the hook alone):

{
  "hooks": {
    "UserPromptSubmit": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "RAGDOWN_URL=http://localhost:3300 RAGDOWN_TOKEN=... node /path/to/mcp-ragdown/src/cli.ts hook",
            "timeout": 10
          }
        ]
      }
    ]
  }
}

Local process

The MCP server:

claude mcp add ragdown -e RAGDOWN_DOCS_DIR=$HOME/notes -- node /path/to/mcp-ragdown/src/cli.ts stdio

The context hook, in ~/.claude/settings.json (or a project's .claude/settings.json):

{
  "hooks": {
    "UserPromptSubmit": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "RAGDOWN_DOCS_DIR=$HOME/notes node /path/to/mcp-ragdown/src/cli.ts hook",
            "timeout": 10
          }
        ]
      }
    ]
  }
}

The hook reads the prompt and asks the running server over its socket for sections with cosine similarity of at least RAGDOWN_HOOK_MIN_SCORE. It prints them as additionalContext, wrapped in <ragdown-context>. Each section is injected at most once per session. Prompts under 12 characters and slash commands are skipped. A failure is logged to stderr and never blocks the prompt.

Tools

Tool

What it does

ragdown_recall

Hybrid search. Returns path, line range, heading breadcrumb and similarity for each hit. Takes top_k, path_prefix, format: text|json and max_chars.

ragdown_read_doc

Reads a file, or a line range of one, straight from disk. Never clipped.

ragdown_stats

Folder, index size, embedder, role (primary or reader), whether a sync is running, and the last sync.

ragdown_remember

Writes a new note (with frontmatter) under RAGDOWN_NOTES_DIR and indexes it before returning. Never overwrites a file.

ragdown_reindex

Syncs now; full: true re-embeds everything.

The two write tools are not listed when RAGDOWN_READ_ONLY=true.

Configuration

Only RAGDOWN_DOCS_DIR is required. See .env.example.

Variable

Default

RAGDOWN_DOCS_DIR

The Markdown folder, walked recursively. Dot-folders and node_modules are skipped, and symlinks are not followed. Indexes .md, .markdown and .mdx.

RAGDOWN_DATA_DIR

~/.cache/ragdown/<hash of docs dir>

The index. Deleting it only costs a rebuild.

RAGDOWN_MODELS

~/.cache/ragdown/models

Model cache, shared by every folder.

RAGDOWN_EMBEDDER

bge-small

bge-small, openai:<model> (any OpenAI-compatible /embeddings endpoint, such as Ollama or llama.cpp), or hash (tests only).

RAGDOWN_EMBEDDING_URL / _API_KEY

OpenAI

For openai:<model>.

RAGDOWN_THREADS

half the cores

ONNX Runtime threads for bge-small.

RAGDOWN_WATCH

true

Watch the folder; without a watcher, sync on start and on ragdown_reindex only.

RAGDOWN_READ_ONLY

false

Hide the write tools.

RAGDOWN_NOTES_DIR

notes

Where ragdown_remember writes. Must be inside the docs folder.

RAGDOWN_TEXT_LIMIT

2000

Characters per hit in text output. Every cut names the ragdown_read_doc call that returns the rest.

RAGDOWN_HOOK_TOP_K

4

Most sections injected per prompt.

RAGDOWN_HOOK_MIN_SCORE

0.7

Lowest cosine similarity the hook injects.

RAGDOWN_HOOK_MAX_CHARS

6000

Most characters injected per prompt.

RAGDOWN_HOOK_TIMEOUT_MS

5000

How long the hook waits for the server.

PORT

3000

serve only. The HTTP port.

RAGDOWN_TOKEN

serve: the bearer token /mcp and /api/context require. Hook: the token it sends.

SECURE_LOCAL_NET

false

serve only. Skip the token on a trusted network. serve refuses to start with neither.

RAGDOWN_URL

Hook only. Ask this server over HTTP instead of the local socket, and load nothing locally.

Commands and HTTP

node src/cli.ts <command>: stdio (the MCP server Claude Code launches), serve (HTTP, what the image runs), hook, index [--full], search <query> and stats.

serve exposes three routes:

Route

Auth

GET /api/status

none

Liveness and index stats. ready: false while the model loads.

/mcp

bearer

Streamable HTTP MCP, stateless.

POST /api/context

bearer

{prompt, session_id}{context}, what a remote hook asks for.

Design

Chunks follow headings. Every heading starts a section, and the section's breadcrumb (Backups › Restore) is part of what gets embedded. That is how a paragraph that only says "run it twice" is found by a question about restoring backups. A section longer than 1,500 characters (about 400 tokens, well inside bge's 512) is packed paragraph by paragraph. Fenced code blocks are never split. Line numbers refer to the original file, so a hit is always one ragdown_read_doc call away from its surroundings.

Hybrid retrieval. Dense cosine search finds a paragraph that answers the question in different words. BM25 full-text search finds an exact error string or flag name that an embedding blurs. Both return a pool, and reciprocal rank fusion (k = 60) merges them. Ranking uses the fused score. Filtering uses cosine similarity, because a fused score is not comparable across queries.

Calibrating MIN_SCORE. On a 1,900-chunk corpus of engineering notes with bge-small:

  • On-topic questions scored their best hits at 0.73–0.79.

  • Unrelated prompts ("weather in Paris", "pasta recipe") peaked at 0.53–0.57.

  • Generic coding requests ("refactor this to async/await") reached 0.62–0.68.

0.7 injects on-topic notes and skips the rest. Other embedders need their own threshold.

The index is derived data. meta.json records the embedder and chunker version, and a mismatch drops and rebuilds the index instead of migrating it. Syncs are diffs:

  1. Files whose size and mtime are unchanged are skipped without being read.

  2. A content hash decides whether a changed file is re-embedded.

  3. Files gone from disk are dropped.

A file's chunks are replaced with one delete and one add. Syncs never overlap: changes that arrive during a sync share one follow-up. The watcher debounces for 750 ms and falls back to polling every 60 s where recursive fs.watch fails.

One primary per index. Several Claude Code windows on the same folder must not all index it. The process that binds <data dir>/primary.sock is the primary: it indexes, watches and answers the hook. The others are readers. They search the same LanceDB table (which sees the primary's commits) and forward syncs to the primary. Holding the socket is the lock. A crashed primary leaves a socket nobody listens on, and the next process takes it over; readers retry every 30 s. When no server is running at all, the hook becomes a primary for the length of one call, which costs about a second.

Searches never wait for indexing. The first index of a large folder takes minutes, so until it finishes, searches answer from whatever is indexed so far. ragdown_stats shows syncing. Run ragdown index once before relying on the hook alone. A hook-only setup never keeps a process alive long enough to finish a big first index.

Why TypeScript, not Rust. The plan allowed a Rust/napi port if it paid for itself. It does not. Measured on an i9-13900H:

Model load (warm cache)

~300 ms

Query embedding

~23 ms

Hook round trip through a running server

~160 ms, mostly Node startup

Search from a cold CLI process

~0.9 s

First index, 105 files / 1,919 chunks

180 s (~11 chunks/s)

Re-sync with nothing changed

~40 ms

Almost all indexing time is the ONNX Runtime forward pass, which is native C++. Tokenizing takes about 1 ms a chunk, and raw onnxruntime-node without transformers.js measured the same throughput. A Rust port would call the same kernels. Two changes did help, and neither depends on the language:

  • Batch chunks by length. A batch is padded to its longest member.

  • Use half the cores. Four threads beat eight on this P/E-core CPU.

For faster indexing, switch the embedder to a GPU-backed openai:<model> endpoint.

Development

npm run typecheck && npm run lint && npm test

The tests run against real LanceDB, the real socket and the MCP SDK's in-memory transport. They use the hash embedder, so they need no model download.

Available Tools

5 tools
ragdown_read_docRead a noteA
Read-only

Read a Markdown file from the notes folder, whole or by line range, straight from disk. Never clipped. Use it to see the context around a ragdown_recall hit.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesPath relative to the notes root, as returned by ragdown_recall
end_lineNo
start_lineNo

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuine behavioral context not in annotations: retrieval is "straight from disk" and "Never clipped", telling the agent results are raw and untruncated. It omits error behavior for missing paths or out-of-range lines, keeping it below a 5.

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

Conciseness5/5

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

Three short sentences with zero filler; the core capability is front-loaded and the routing hint follows immediately. Every clause earns its place.

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?

There is no output schema, so the description carries the burden of describing what comes back, and "Never clipped" plus "straight from disk" does that adequately for a read tool. What is missing is edge-case behavior (nonexistent path, line range beyond file length), a minor gap for a simple read operation.

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 only 33%: path is documented in the schema, but start_line and end_line are bare integers with no constraints described. The description compensates partially by framing the tool as fetching "whole or by line range", giving the two range parameters meaning, but it does not clarify inclusivity, whether both are required together, or what happens with only one supplied.

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?

States a specific verb (read) and resource (a Markdown file from the notes folder), plus scope (whole file or a line range, straight from disk). It explicitly names the sibling ragdown_recall, so an agent can distinguish this file-fetch tool from the semantic search tool without opening either schema.

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?

"Use it to see the context around a ragdown_recall hit" gives a concrete when-to-use condition tied to the sibling tool, effectively routing the agent between recall and read. It stops short of stating when not to use it (e.g. when no hit is in hand), so it is clear context rather than full when/when-not guidance.

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

ragdown_recallSearch notesA
Read-only

Hybrid (semantic + keyword) search over the user's Markdown notes. Returns the most relevant sections with file path, line range, heading breadcrumb and cosine similarity (above ~0.7 is usually on topic). Use it before answering anything the notes may cover; follow up with ragdown_read_doc for the surrounding text.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesWhat to look for, as a question or keywords
top_kNo
formatNotext
max_charsNotext format: characters per hit before it is clipped (0 = never)
path_prefixNoOnly search files under this folder, relative to the notes root, e.g. 'projects/'

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, but the description adds real behavioral content: it discloses the return shape (file path, line range, heading breadcrumb, cosine similarity) and gives an interpretive threshold ('above ~0.7 is usually on topic'). It does not address result limits or clipping behavior beyond what the schema says.

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 sentences, zero filler, and the core capability plus return format are front-loaded before the usage directive. Every clause carries information an agent needs.

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?

With no output schema, the description carries the burden of explaining returns and does so concretely, and annotations cover the safety profile. It leaves top_k/format usage and result-limit behavior implicit, a minor gap for a 5-parameter read tool.

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 60%, so the schema documents query, max_chars and path_prefix but leaves top_k and format bare. The description adds no parameter-level meaning — no guidance on top_k sizing, format choice, or path_prefix scoping — so it neither compensates for the gap nor adds beyond the schema. Baseline 3 is appropriate.

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?

Names a specific verb and resource ('hybrid (semantic + keyword) search over the user's Markdown notes') and distinguishes itself from siblings by routing the agent to ragdown_read_doc for surrounding text. An agent can tell this apart from ragdown_stats, ragdown_remember and ragdown_reindex without opening any schema.

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 states when to use it ('before answering anything the notes may cover') and names the follow-up alternative ragdown_read_doc with its purpose. It lacks exclusions (e.g., when to prefer ragdown_remember or ragdown_stats), so it falls short of the full when/when-not/alternatives bar.

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

ragdown_reindexReindex notesA

Bring the index up to date with the folder now. Changes are normally picked up automatically within a second; use this after bulk edits made while no server was running, or full: true to re-embed everything.

ParametersJSON Schema
NameRequiredDescriptionDefault
fullNo

TDQS

A4.3/5.0
Behavior4/5

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

Annotations declare a safe mutation (readOnlyHint=false, destructiveHint=false, openWorldHint=false); the description adds valuable context beyond them by explaining that indexing is normally automatic and this is a manual, idempotent corrective action. It doesn't hint at cost or duration of a full re-embed, which is the one meaningful gap for a potentially expensive operation.

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 sentences, zero filler. The primary action and its trigger condition are front-loaded, and the parameter note comes second where it belongs.

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?

No output schema and only one optional parameter, so little needs explaining; the description covers purpose, trigger, and parameter semantics adequately. It stops short of stating what happens on completion or how long a full reindex takes, a minor omission for an operation that may be long-running.

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?

Schema coverage is 0% and the lone boolean has no description in the schema, but the description supplies its meaning: 'full: true to re-embed everything', implying the default false does an incremental update. That is exactly the compensation a low-coverage schema needs.

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?

States a specific verb+resource: 'Bring the index up to date with the folder now.' An agent can distinguish this from siblings like ragdown_recall or ragdown_read_doc, which are read/query tools, though the description doesn't explicitly name any sibling to disambiguate against.

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

Usage Guidelines5/5

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

Explicitly gives both when-not and when: 'Changes are normally picked up automatically within a second; use this after bulk edits made while no server was running.' It also names the escalation path ('full: true to re-embed everything'), so the agent knows the default vs. thorough mode.

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

ragdown_rememberWrite a noteA

Save something worth keeping (a decision, a fix, a how-to) as a new Markdown note in the notes folder, indexed immediately so later searches find it. Never overwrites an existing file.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoFile name under the notes folder, without .md; defaults to <date>-<title-slug>
tagsNo
titleYes
contentYesMarkdown body; the title and date go in frontmatter

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already declare a non-destructive write, but the description adds real behavioral context beyond them: writes are indexed immediately (so search finds them) and existing files are never overwritten. That indexing and collision-safety behavior is not derivable from the annotation flags.

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 tightly packed sentences: the write action and immediate indexing come first, the non-overwrite guarantee second. No filler and nothing redundant.

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 non-destructive write tool with full annotation coverage and no output schema, the description covers the essential behavior including indexing. It leaves minor gaps, such as what is returned and what happens on a name collision given files are never overwritten, but the core call path is complete.

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

Parameters2/5

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

Schema description coverage is only 50% — 'title' and 'tags' have no schema descriptions. The description mentions that Markdown frontmatter carries the title, but adds nothing about 'tags' or the 'name' default/format, so it fails to compensate for the coverage gap.

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?

States a specific verb (save/write) and resource (Markdown note in the notes folder) and characterizes the kind of content it holds. It does not name a sibling tool, but the 'so later searches find it' clause implicitly ties it to ragdown_recall, making it distinguishable from the read-side tools.

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?

Gives positive guidance about what belongs here (a decision, a fix, a how-to) which is useful for choosing to write. However it names no alternative and no when-not condition — e.g. when to use this versus ragdown_reindex or ragdown_read_doc — leaving routing to inference.

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

ragdown_statsIndex statusA
Read-only

The notes folder, index size (files, chunks), embedder, whether this process is the indexing primary, and the last sync. include_files lists every indexed file.

ParametersJSON Schema
NameRequiredDescriptionDefault
include_filesNo

TDQS

A3.6/5.0
Behavior4/5

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

Annotations only declare readOnlyHint and a closed-world hint, so the description adds real value: it discloses that the response includes per-process role information (whether this process is the indexing primary) and the last sync, which is meaningful multi-process context. It stops short of describing error behavior or output format, but for a read-only status call that is a minor gap.

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

Conciseness4/5

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

Two compact sentences with no filler; the reported-field list comes first and the parameter note last. The field enumeration is dense but each item earns its place by telling the agent what to expect back.

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?

With no output schema, the description carries the return-value burden and largely does so by naming each reported field. Minor omissions remain — no note on response shape or behavior when no index exists — but the essential content is covered for a simple read-only stats call.

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?

Schema description coverage is 0% and the single boolean parameter is undocumented in the schema, but the description compensates by explaining that include_files makes the response list every indexed file. It does not restate the default-false behavior or note the cost of enumerating all files, so it is good rather than complete.

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 enumerates exactly what the tool reports (notes folder, index size in files/chunks, embedder, indexing-primary flag, last sync), so an agent can tell it returns index status rather than notes or documents. It lacks a leading verb phrase and never names the sibling tools it differs from, so the differentiation is inferential rather than explicit.

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?

There is no statement of when to call this versus ragdown_recall, ragdown_read_doc, or ragdown_reindex, and no prerequisites or diagnostic context. An agent must guess that this is a status/inspection tool rather than a retrieval one.

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.

  1. 5 tool updatesv1.0.0
    • First observedragdown_read_doc
    • First observedragdown_recall
    • First observedragdown_reindex
    • First observedragdown_remember
    • First observedragdown_stats

TDQS

A4.1/5.0

Scored across 5 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: recall is search, read_doc is read, stats is metadata, remember is create, reindex is maintenance. No overlap or ambiguity exists.

Naming Consistency5/5

All tools use the ragdown_ prefix with a concise verb/noun pattern (recall, read_doc, stats, remember, reindex). Consistent and predictable.

Tool Count5/5

Five tools provide a complete, well-scoped set for a note-taking RAG server: search, read, create, inspect, and maintain. No tool feels redundant or missing.

Completeness4/5

Core CRUD plus search and index maintenance are covered, but update and delete operations for notes are absent, leaving minor gaps for lifecycle management.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    Enables AI agents to search local Markdown documents using natural language, with automatic indexing and section-level retrieval.
    10
    2 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables AI assistants to search, read, create, update, and remove personal markdown notes stored locally, providing persistent memory across sessions.
    60 npm
    2
    MIT