Repository files navigation

English / 日本語

mrag — Micro RAG

A lightweight, local-first retrieval runtime for building RAG pipelines.

mrag is a CLI for building and operating small-scale RAG knowledge bases. It provides everything from document indexing to search, with a variety of strategies for building custom RAG pipelines to fit your needs. Skills for AI agents let you expose your knowledge base to any AI agent.

mrag ingests Markdown and plain text. Converting other formats is the job of a document conversion engine such as docling or MarkItDown; run one of those first and feed mrag the Markdown it produces.


Release notes, including breaking changes and upgrade steps, live in CHANGELOG.md.


Requirements

ComponentNotes
Python 3.11+
Ollamaollama serve must be running. Defaults use bge-m3 for embeddings and gemma4:e2b for contextual augmentation
QdrantThe default local mode runs Qdrant in-process. Docker Qdrant is required only when qdrant.mode: server is set

Installation

git clone https://github.com/bathtimefish/mrag.git
cd mrag

You can run an agent such as Claude Code in the cloned directory and have it read SETUP.md to complete the setup automatically.

The manual setup steps are below.

We recommend uv for installing Python modules:

uv venv
uv pip install -e ".[vaporetto,reranker]"

This installs the standard configuration that includes Japanese morphological tokenization (vaporetto) and CrossEncoder reranking (reranker).

Vaporetto native library

The vaporetto extra installs apsw (for SQLite extension loading), but the native shared library must be placed separately.

  1. Download the latest -with-model.tar.gz that matches your OS / architecture from sqlite-vaporetto releases (use the model-bundled variant).

  2. Extract the archive and place the shared library under ~/.mrag/extensions/:

    mkdir -p ~/.mrag/extensions
    cp libsqlite_vaporetto.dylib ~/.mrag/extensions/ # macOS# cp libsqlite_vaporetto.so ~/.mrag/extensions/ # Linux

To use a custom path, set the environment variable:

export MRAG_VAPORETTO_LIB=/path/to/libsqlite_vaporetto.dylib

If vaporetto is not detected when you run mrag init, mrag falls back to the trigram tokenizer automatically. Run mrag doctor to verify the detection state.

Pull the embedding model

ollama pull bge-m3

bge-m3 is a multilingual model that supports Japanese and English (1024 dimensions). You can swap it for any Ollama-compatible model by editing profiles/default.yaml.

Quick Start

Four mrag commands are all it takes to create a KB from a directory and search it:

mrag init my-kb --non-interactive
cd my-kb
mrag add /path/to/documents --recursive --include '**/*.md'
mrag index
mrag search "your query"

Pass a single file instead of a directory when bulk ingestion is unnecessary. Adding and indexing are intentionally separate operations.

For step-by-step details and the agent-integration workflow, see docs/tutorial.md.

CLI commands

CommandRole
mrag init [PROJECT_DIR]Initialize a project
mrag add <path>Add one document, or a directory with --recursive
mrag indexBuild the index
mrag reindexRebuild the index
mrag search <query>Run a search
mrag eval <query>Evaluate retrieval quality
mrag serveStart the HTTP API server
mrag mcpExpose the project as a read-only MCP server
mrag remove <doc-id>Remove a document
mrag exclusions add | list | restoreRetain a document while excluding it from retrieval
mrag profiles list | show <name>List or show profile details
mrag kb-info show | validate | schemaManage the knowledge-base self-description
mrag inspect document | chunks | chunk | sectionsInspect the index internals
mrag registry generate | validateManage the multi-KB registry
mrag extract <file>Run text extraction only
mrag show-extracted <doc-id>Show the extracted text
mrag export-extracted <doc-id>Export the extracted text to a file
mrag doctorCheck the environment

Run mrag <command> --help for the full set of options.

For directory ingestion, preview with mrag add <dir> --recursive --dry-run --json, then apply the same selection without --dry-run. See recursive directory ingestion for filtering, symlink, duplicate, concurrency, and partial-success behavior.

To stop a retained document from contributing knowledge, use the dry-run-first mrag exclusions workflow instead of mrag remove. See document retrieval exclusions for cleanup, restoration, and failure semantics.

Documentation

Per-feature details live under ./docs/.

Getting Started

  • tutorial.md — Your first mrag session (init → add → index → search)
  • recursive-add.md — Safe bulk ingestion with filters and deterministic reporting

Retrieval

Operations

API

  • mcp.md — Model Context Protocol server (mrag mcp)
  • dify-api.md — Dify External Knowledge API compatible endpoint
  • native-api.md — mrag Native REST API

Deployment

  • packaging.md — Single-binary packaging with PyInstaller (optional distribution method)

License

Copyright (c) 2026 BathTimeFish KK.

Licensed under the MIT License.

Releases up to and including 0.27.0 were licensed under AGPL-3.0, a condition of the PyMuPDF dependency that 1.0.0 removed.

Third-party dependency licenses are listed in THIRD_PARTY_NOTICES.md.

Acknowledgements

mrag uses sqlite-vaporetto by @hotchpotch for Japanese morphological tokenization via SQLite FTS5.

  • sqlite-vaporetto — licensed under MIT OR Apache-2.0
  • bundled model (bccwj-suw+unidic_pos+kana.model.zst, included in -with-model releases) — licensed under BSD-3-Clause, sourced from daac-tools/vaporetto-models

If you redistribute mrag together with the sqlite-vaporetto library or its bundled model, the BSD-3-Clause copyright notice for the model must be included in your distribution.

About

A lightweight local-first retrieval runtime for building RAG pipelines

Resources

Stars

8 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

English / 日本語

mrag — Micro RAG

A lightweight, local-first retrieval runtime for building RAG pipelines.

mrag is a CLI for building and operating small-scale RAG knowledge bases. It provides everything from document indexing to search, with a variety of strategies for building custom RAG pipelines to fit your needs. Skills for AI agents let you expose your knowledge base to any AI agent.

mrag ingests Markdown and plain text. Converting other formats is the job of a document conversion engine such as docling or MarkItDown; run one of those first and feed mrag the Markdown it produces.


Release notes, including breaking changes and upgrade steps, live in CHANGELOG.md.


Requirements

ComponentNotes
Python 3.11+
Ollamaollama serve must be running. Defaults use bge-m3 for embeddings and gemma4:e2b for contextual augmentation
QdrantThe default local mode runs Qdrant in-process. Docker Qdrant is required only when qdrant.mode: server is set

Installation

git clone https://github.com/bathtimefish/mrag.git
cd mrag

You can run an agent such as Claude Code in the cloned directory and have it read SETUP.md to complete the setup automatically.

The manual setup steps are below.

We recommend uv for installing Python modules:

uv venv
uv pip install -e ".[vaporetto,reranker]"

This installs the standard configuration that includes Japanese morphological tokenization (vaporetto) and CrossEncoder reranking (reranker).

Vaporetto native library

The vaporetto extra installs apsw (for SQLite extension loading), but the native shared library must be placed separately.

  1. Download the latest -with-model.tar.gz that matches your OS / architecture from sqlite-vaporetto releases (use the model-bundled variant).

  2. Extract the archive and place the shared library under ~/.mrag/extensions/:

    mkdir -p ~/.mrag/extensions
    cp libsqlite_vaporetto.dylib ~/.mrag/extensions/ # macOS# cp libsqlite_vaporetto.so ~/.mrag/extensions/ # Linux

To use a custom path, set the environment variable:

export MRAG_VAPORETTO_LIB=/path/to/libsqlite_vaporetto.dylib

If vaporetto is not detected when you run mrag init, mrag falls back to the trigram tokenizer automatically. Run mrag doctor to verify the detection state.

Pull the embedding model

ollama pull bge-m3

bge-m3 is a multilingual model that supports Japanese and English (1024 dimensions). You can swap it for any Ollama-compatible model by editing profiles/default.yaml.

Quick Start

Four mrag commands are all it takes to create a KB from a directory and search it:

mrag init my-kb --non-interactive
cd my-kb
mrag add /path/to/documents --recursive --include '**/*.md'
mrag index
mrag search "your query"

Pass a single file instead of a directory when bulk ingestion is unnecessary. Adding and indexing are intentionally separate operations.

For step-by-step details and the agent-integration workflow, see docs/tutorial.md.

CLI commands

CommandRole
mrag init [PROJECT_DIR]Initialize a project
mrag add <path>Add one document, or a directory with --recursive
mrag indexBuild the index
mrag reindexRebuild the index
mrag search <query>Run a search
mrag eval <query>Evaluate retrieval quality
mrag serveStart the HTTP API server
mrag mcpExpose the project as a read-only MCP server
mrag remove <doc-id>Remove a document
mrag exclusions add | list | restoreRetain a document while excluding it from retrieval
mrag profiles list | show <name>List or show profile details
mrag kb-info show | validate | schemaManage the knowledge-base self-description
mrag inspect document | chunks | chunk | sectionsInspect the index internals
mrag registry generate | validateManage the multi-KB registry
mrag extract <file>Run text extraction only
mrag show-extracted <doc-id>Show the extracted text
mrag export-extracted <doc-id>Export the extracted text to a file
mrag doctorCheck the environment

Run mrag <command> --help for the full set of options.

For directory ingestion, preview with mrag add <dir> --recursive --dry-run --json, then apply the same selection without --dry-run. See recursive directory ingestion for filtering, symlink, duplicate, concurrency, and partial-success behavior.

To stop a retained document from contributing knowledge, use the dry-run-first mrag exclusions workflow instead of mrag remove. See document retrieval exclusions for cleanup, restoration, and failure semantics.

Documentation

Per-feature details live under ./docs/.

Getting Started

  • tutorial.md — Your first mrag session (init → add → index → search)
  • recursive-add.md — Safe bulk ingestion with filters and deterministic reporting

Retrieval

Operations

API

  • mcp.md — Model Context Protocol server (mrag mcp)
  • dify-api.md — Dify External Knowledge API compatible endpoint
  • native-api.md — mrag Native REST API

Deployment

  • packaging.md — Single-binary packaging with PyInstaller (optional distribution method)

License

Copyright (c) 2026 BathTimeFish KK.

Licensed under the MIT License.

Releases up to and including 0.27.0 were licensed under AGPL-3.0, a condition of the PyMuPDF dependency that 1.0.0 removed.

Third-party dependency licenses are listed in THIRD_PARTY_NOTICES.md.

Acknowledgements

mrag uses sqlite-vaporetto by @hotchpotch for Japanese morphological tokenization via SQLite FTS5.

  • sqlite-vaporetto — licensed under MIT OR Apache-2.0
  • bundled model (bccwj-suw+unidic_pos+kana.model.zst, included in -with-model releases) — licensed under BSD-3-Clause, sourced from daac-tools/vaporetto-models

If you redistribute mrag together with the sqlite-vaporetto library or its bundled model, the BSD-3-Clause copyright notice for the model must be included in your distribution.

About

A lightweight local-first retrieval runtime for building RAG pipelines

Resources

Stars

8 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

English / 日本語

mrag — Micro RAG

A lightweight, local-first retrieval runtime for building RAG pipelines.

mrag is a CLI for building and operating small-scale RAG knowledge bases. It provides everything from document indexing to search, with a variety of strategies for building custom RAG pipelines to fit your needs. Skills for AI agents let you expose your knowledge base to any AI agent.

mrag ingests Markdown and plain text. Converting other formats is the job of a document conversion engine such as docling or MarkItDown; run one of those first and feed mrag the Markdown it produces.


Release notes, including breaking changes and upgrade steps, live in CHANGELOG.md.


Requirements

ComponentNotes
Python 3.11+
Ollamaollama serve must be running. Defaults use bge-m3 for embeddings and gemma4:e2b for contextual augmentation
QdrantThe default local mode runs Qdrant in-process. Docker Qdrant is required only when qdrant.mode: server is set

Installation

git clone https://github.com/bathtimefish/mrag.git
cd mrag

You can run an agent such as Claude Code in the cloned directory and have it read SETUP.md to complete the setup automatically.

The manual setup steps are below.

We recommend uv for installing Python modules:

uv venv
uv pip install -e ".[vaporetto,reranker]"

This installs the standard configuration that includes Japanese morphological tokenization (vaporetto) and CrossEncoder reranking (reranker).

Vaporetto native library

The vaporetto extra installs apsw (for SQLite extension loading), but the native shared library must be placed separately.

  1. Download the latest -with-model.tar.gz that matches your OS / architecture from sqlite-vaporetto releases (use the model-bundled variant).

  2. Extract the archive and place the shared library under ~/.mrag/extensions/:

    mkdir -p ~/.mrag/extensions
    cp libsqlite_vaporetto.dylib ~/.mrag/extensions/ # macOS# cp libsqlite_vaporetto.so ~/.mrag/extensions/ # Linux

To use a custom path, set the environment variable:

export MRAG_VAPORETTO_LIB=/path/to/libsqlite_vaporetto.dylib

If vaporetto is not detected when you run mrag init, mrag falls back to the trigram tokenizer automatically. Run mrag doctor to verify the detection state.

Pull the embedding model

ollama pull bge-m3

bge-m3 is a multilingual model that supports Japanese and English (1024 dimensions). You can swap it for any Ollama-compatible model by editing profiles/default.yaml.

Quick Start

Four mrag commands are all it takes to create a KB from a directory and search it:

mrag init my-kb --non-interactive
cd my-kb
mrag add /path/to/documents --recursive --include '**/*.md'
mrag index
mrag search "your query"

Pass a single file instead of a directory when bulk ingestion is unnecessary. Adding and indexing are intentionally separate operations.

For step-by-step details and the agent-integration workflow, see docs/tutorial.md.

CLI commands

CommandRole
mrag init [PROJECT_DIR]Initialize a project
mrag add <path>Add one document, or a directory with --recursive
mrag indexBuild the index
mrag reindexRebuild the index
mrag search <query>Run a search
mrag eval <query>Evaluate retrieval quality
mrag serveStart the HTTP API server
mrag mcpExpose the project as a read-only MCP server
mrag remove <doc-id>Remove a document
mrag exclusions add | list | restoreRetain a document while excluding it from retrieval
mrag profiles list | show <name>List or show profile details
mrag kb-info show | validate | schemaManage the knowledge-base self-description
mrag inspect document | chunks | chunk | sectionsInspect the index internals
mrag registry generate | validateManage the multi-KB registry
mrag extract <file>Run text extraction only
mrag show-extracted <doc-id>Show the extracted text
mrag export-extracted <doc-id>Export the extracted text to a file
mrag doctorCheck the environment

Run mrag <command> --help for the full set of options.

For directory ingestion, preview with mrag add <dir> --recursive --dry-run --json, then apply the same selection without --dry-run. See recursive directory ingestion for filtering, symlink, duplicate, concurrency, and partial-success behavior.

To stop a retained document from contributing knowledge, use the dry-run-first mrag exclusions workflow instead of mrag remove. See document retrieval exclusions for cleanup, restoration, and failure semantics.

Documentation

Per-feature details live under ./docs/.

Getting Started

  • tutorial.md — Your first mrag session (init → add → index → search)
  • recursive-add.md — Safe bulk ingestion with filters and deterministic reporting

Retrieval

Operations

API

  • mcp.md — Model Context Protocol server (mrag mcp)
  • dify-api.md — Dify External Knowledge API compatible endpoint
  • native-api.md — mrag Native REST API

Deployment

  • packaging.md — Single-binary packaging with PyInstaller (optional distribution method)

License

Copyright (c) 2026 BathTimeFish KK.

Licensed under the MIT License.

Releases up to and including 0.27.0 were licensed under AGPL-3.0, a condition of the PyMuPDF dependency that 1.0.0 removed.

Third-party dependency licenses are listed in THIRD_PARTY_NOTICES.md.

Acknowledgements

mrag uses sqlite-vaporetto by @hotchpotch for Japanese morphological tokenization via SQLite FTS5.

  • sqlite-vaporetto — licensed under MIT OR Apache-2.0
  • bundled model (bccwj-suw+unidic_pos+kana.model.zst, included in -with-model releases) — licensed under BSD-3-Clause, sourced from daac-tools/vaporetto-models

If you redistribute mrag together with the sqlite-vaporetto library or its bundled model, the BSD-3-Clause copyright notice for the model must be included in your distribution.

About

A lightweight local-first retrieval runtime for building RAG pipelines

Resources

Stars

8 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

English / 日本語

mrag — Micro RAG

A lightweight, local-first retrieval runtime for building RAG pipelines.

mrag is a CLI for building and operating small-scale RAG knowledge bases. It provides everything from document indexing to search, with a variety of strategies for building custom RAG pipelines to fit your needs. Skills for AI agents let you expose your knowledge base to any AI agent.

mrag ingests Markdown and plain text. Converting other formats is the job of a document conversion engine such as docling or MarkItDown; run one of those first and feed mrag the Markdown it produces.


Release notes, including breaking changes and upgrade steps, live in CHANGELOG.md.


Requirements

ComponentNotes
Python 3.11+
Ollamaollama serve must be running. Defaults use bge-m3 for embeddings and gemma4:e2b for contextual augmentation
QdrantThe default local mode runs Qdrant in-process. Docker Qdrant is required only when qdrant.mode: server is set

Installation

git clone https://github.com/bathtimefish/mrag.git
cd mrag

You can run an agent such as Claude Code in the cloned directory and have it read SETUP.md to complete the setup automatically.

The manual setup steps are below.

We recommend uv for installing Python modules:

uv venv
uv pip install -e ".[vaporetto,reranker]"

This installs the standard configuration that includes Japanese morphological tokenization (vaporetto) and CrossEncoder reranking (reranker).

Vaporetto native library

The vaporetto extra installs apsw (for SQLite extension loading), but the native shared library must be placed separately.

  1. Download the latest -with-model.tar.gz that matches your OS / architecture from sqlite-vaporetto releases (use the model-bundled variant).

  2. Extract the archive and place the shared library under ~/.mrag/extensions/:

    mkdir -p ~/.mrag/extensions
    cp libsqlite_vaporetto.dylib ~/.mrag/extensions/ # macOS# cp libsqlite_vaporetto.so ~/.mrag/extensions/ # Linux

To use a custom path, set the environment variable:

export MRAG_VAPORETTO_LIB=/path/to/libsqlite_vaporetto.dylib

If vaporetto is not detected when you run mrag init, mrag falls back to the trigram tokenizer automatically. Run mrag doctor to verify the detection state.

Pull the embedding model

ollama pull bge-m3

bge-m3 is a multilingual model that supports Japanese and English (1024 dimensions). You can swap it for any Ollama-compatible model by editing profiles/default.yaml.

Quick Start

Four mrag commands are all it takes to create a KB from a directory and search it:

mrag init my-kb --non-interactive
cd my-kb
mrag add /path/to/documents --recursive --include '**/*.md'
mrag index
mrag search "your query"

Pass a single file instead of a directory when bulk ingestion is unnecessary. Adding and indexing are intentionally separate operations.

For step-by-step details and the agent-integration workflow, see docs/tutorial.md.

CLI commands

CommandRole
mrag init [PROJECT_DIR]Initialize a project
mrag add <path>Add one document, or a directory with --recursive
mrag indexBuild the index
mrag reindexRebuild the index
mrag search <query>Run a search
mrag eval <query>Evaluate retrieval quality
mrag serveStart the HTTP API server
mrag mcpExpose the project as a read-only MCP server
mrag remove <doc-id>Remove a document
mrag exclusions add | list | restoreRetain a document while excluding it from retrieval
mrag profiles list | show <name>List or show profile details
mrag kb-info show | validate | schemaManage the knowledge-base self-description
mrag inspect document | chunks | chunk | sectionsInspect the index internals
mrag registry generate | validateManage the multi-KB registry
mrag extract <file>Run text extraction only
mrag show-extracted <doc-id>Show the extracted text
mrag export-extracted <doc-id>Export the extracted text to a file
mrag doctorCheck the environment

Run mrag <command> --help for the full set of options.

For directory ingestion, preview with mrag add <dir> --recursive --dry-run --json, then apply the same selection without --dry-run. See recursive directory ingestion for filtering, symlink, duplicate, concurrency, and partial-success behavior.

To stop a retained document from contributing knowledge, use the dry-run-first mrag exclusions workflow instead of mrag remove. See document retrieval exclusions for cleanup, restoration, and failure semantics.

Documentation

Per-feature details live under ./docs/.

Getting Started

  • tutorial.md — Your first mrag session (init → add → index → search)
  • recursive-add.md — Safe bulk ingestion with filters and deterministic reporting

Retrieval

Operations

API

  • mcp.md — Model Context Protocol server (mrag mcp)
  • dify-api.md — Dify External Knowledge API compatible endpoint
  • native-api.md — mrag Native REST API

Deployment

  • packaging.md — Single-binary packaging with PyInstaller (optional distribution method)

License

Copyright (c) 2026 BathTimeFish KK.

Licensed under the MIT License.

Releases up to and including 0.27.0 were licensed under AGPL-3.0, a condition of the PyMuPDF dependency that 1.0.0 removed.

Third-party dependency licenses are listed in THIRD_PARTY_NOTICES.md.

Acknowledgements

mrag uses sqlite-vaporetto by @hotchpotch for Japanese morphological tokenization via SQLite FTS5.

  • sqlite-vaporetto — licensed under MIT OR Apache-2.0
  • bundled model (bccwj-suw+unidic_pos+kana.model.zst, included in -with-model releases) — licensed under BSD-3-Clause, sourced from daac-tools/vaporetto-models

If you redistribute mrag together with the sqlite-vaporetto library or its bundled model, the BSD-3-Clause copyright notice for the model must be included in your distribution.

About

A lightweight local-first retrieval runtime for building RAG pipelines

Resources

Stars

8 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

English / 日本語

mrag — Micro RAG

A lightweight, local-first retrieval runtime for building RAG pipelines.

mrag is a CLI for building and operating small-scale RAG knowledge bases. It provides everything from document indexing to search, with a variety of strategies for building custom RAG pipelines to fit your needs. Skills for AI agents let you expose your knowledge base to any AI agent.

mrag ingests Markdown and plain text. Converting other formats is the job of a document conversion engine such as docling or MarkItDown; run one of those first and feed mrag the Markdown it produces.


Release notes, including breaking changes and upgrade steps, live in CHANGELOG.md.


Requirements

ComponentNotes
Python 3.11+
Ollamaollama serve must be running. Defaults use bge-m3 for embeddings and gemma4:e2b for contextual augmentation
QdrantThe default local mode runs Qdrant in-process. Docker Qdrant is required only when qdrant.mode: server is set

Installation

git clone https://github.com/bathtimefish/mrag.git
cd mrag

You can run an agent such as Claude Code in the cloned directory and have it read SETUP.md to complete the setup automatically.

The manual setup steps are below.

We recommend uv for installing Python modules:

uv venv
uv pip install -e ".[vaporetto,reranker]"

This installs the standard configuration that includes Japanese morphological tokenization (vaporetto) and CrossEncoder reranking (reranker).

Vaporetto native library

The vaporetto extra installs apsw (for SQLite extension loading), but the native shared library must be placed separately.

  1. Download the latest -with-model.tar.gz that matches your OS / architecture from sqlite-vaporetto releases (use the model-bundled variant).

  2. Extract the archive and place the shared library under ~/.mrag/extensions/:

    mkdir -p ~/.mrag/extensions
    cp libsqlite_vaporetto.dylib ~/.mrag/extensions/ # macOS# cp libsqlite_vaporetto.so ~/.mrag/extensions/ # Linux

To use a custom path, set the environment variable:

export MRAG_VAPORETTO_LIB=/path/to/libsqlite_vaporetto.dylib

If vaporetto is not detected when you run mrag init, mrag falls back to the trigram tokenizer automatically. Run mrag doctor to verify the detection state.

Pull the embedding model

ollama pull bge-m3

bge-m3 is a multilingual model that supports Japanese and English (1024 dimensions). You can swap it for any Ollama-compatible model by editing profiles/default.yaml.

Quick Start

Four mrag commands are all it takes to create a KB from a directory and search it:

mrag init my-kb --non-interactive
cd my-kb
mrag add /path/to/documents --recursive --include '**/*.md'
mrag index
mrag search "your query"

Pass a single file instead of a directory when bulk ingestion is unnecessary. Adding and indexing are intentionally separate operations.

For step-by-step details and the agent-integration workflow, see docs/tutorial.md.

CLI commands

CommandRole
mrag init [PROJECT_DIR]Initialize a project
mrag add <path>Add one document, or a directory with --recursive
mrag indexBuild the index
mrag reindexRebuild the index
mrag search <query>Run a search
mrag eval <query>Evaluate retrieval quality
mrag serveStart the HTTP API server
mrag mcpExpose the project as a read-only MCP server
mrag remove <doc-id>Remove a document
mrag exclusions add | list | restoreRetain a document while excluding it from retrieval
mrag profiles list | show <name>List or show profile details
mrag kb-info show | validate | schemaManage the knowledge-base self-description
mrag inspect document | chunks | chunk | sectionsInspect the index internals
mrag registry generate | validateManage the multi-KB registry
mrag extract <file>Run text extraction only
mrag show-extracted <doc-id>Show the extracted text
mrag export-extracted <doc-id>Export the extracted text to a file
mrag doctorCheck the environment

Run mrag <command> --help for the full set of options.

For directory ingestion, preview with mrag add <dir> --recursive --dry-run --json, then apply the same selection without --dry-run. See recursive directory ingestion for filtering, symlink, duplicate, concurrency, and partial-success behavior.

To stop a retained document from contributing knowledge, use the dry-run-first mrag exclusions workflow instead of mrag remove. See document retrieval exclusions for cleanup, restoration, and failure semantics.

Documentation

Per-feature details live under ./docs/.

Getting Started

  • tutorial.md — Your first mrag session (init → add → index → search)
  • recursive-add.md — Safe bulk ingestion with filters and deterministic reporting

Retrieval

Operations

API

  • mcp.md — Model Context Protocol server (mrag mcp)
  • dify-api.md — Dify External Knowledge API compatible endpoint
  • native-api.md — mrag Native REST API

Deployment

  • packaging.md — Single-binary packaging with PyInstaller (optional distribution method)

License

Copyright (c) 2026 BathTimeFish KK.

Licensed under the MIT License.

Releases up to and including 0.27.0 were licensed under AGPL-3.0, a condition of the PyMuPDF dependency that 1.0.0 removed.

Third-party dependency licenses are listed in THIRD_PARTY_NOTICES.md.

Acknowledgements

mrag uses sqlite-vaporetto by @hotchpotch for Japanese morphological tokenization via SQLite FTS5.

  • sqlite-vaporetto — licensed under MIT OR Apache-2.0
  • bundled model (bccwj-suw+unidic_pos+kana.model.zst, included in -with-model releases) — licensed under BSD-3-Clause, sourced from daac-tools/vaporetto-models

If you redistribute mrag together with the sqlite-vaporetto library or its bundled model, the BSD-3-Clause copyright notice for the model must be included in your distribution.

About

A lightweight local-first retrieval runtime for building RAG pipelines

Resources

Stars

8 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

English / 日本語

mrag — Micro RAG

A lightweight, local-first retrieval runtime for building RAG pipelines.

mrag is a CLI for building and operating small-scale RAG knowledge bases. It provides everything from document indexing to search, with a variety of strategies for building custom RAG pipelines to fit your needs. Skills for AI agents let you expose your knowledge base to any AI agent.

mrag ingests Markdown and plain text. Converting other formats is the job of a document conversion engine such as docling or MarkItDown; run one of those first and feed mrag the Markdown it produces.


Release notes, including breaking changes and upgrade steps, live in CHANGELOG.md.


Requirements

ComponentNotes
Python 3.11+
Ollamaollama serve must be running. Defaults use bge-m3 for embeddings and gemma4:e2b for contextual augmentation
QdrantThe default local mode runs Qdrant in-process. Docker Qdrant is required only when qdrant.mode: server is set

Installation

git clone https://github.com/bathtimefish/mrag.git
cd mrag

You can run an agent such as Claude Code in the cloned directory and have it read SETUP.md to complete the setup automatically.

The manual setup steps are below.

We recommend uv for installing Python modules:

uv venv
uv pip install -e ".[vaporetto,reranker]"

This installs the standard configuration that includes Japanese morphological tokenization (vaporetto) and CrossEncoder reranking (reranker).

Vaporetto native library

The vaporetto extra installs apsw (for SQLite extension loading), but the native shared library must be placed separately.

  1. Download the latest -with-model.tar.gz that matches your OS / architecture from sqlite-vaporetto releases (use the model-bundled variant).

  2. Extract the archive and place the shared library under ~/.mrag/extensions/:

    mkdir -p ~/.mrag/extensions
    cp libsqlite_vaporetto.dylib ~/.mrag/extensions/ # macOS# cp libsqlite_vaporetto.so ~/.mrag/extensions/ # Linux

To use a custom path, set the environment variable:

export MRAG_VAPORETTO_LIB=/path/to/libsqlite_vaporetto.dylib

If vaporetto is not detected when you run mrag init, mrag falls back to the trigram tokenizer automatically. Run mrag doctor to verify the detection state.

Pull the embedding model

ollama pull bge-m3

bge-m3 is a multilingual model that supports Japanese and English (1024 dimensions). You can swap it for any Ollama-compatible model by editing profiles/default.yaml.

Quick Start

Four mrag commands are all it takes to create a KB from a directory and search it:

mrag init my-kb --non-interactive
cd my-kb
mrag add /path/to/documents --recursive --include '**/*.md'
mrag index
mrag search "your query"

Pass a single file instead of a directory when bulk ingestion is unnecessary. Adding and indexing are intentionally separate operations.

For step-by-step details and the agent-integration workflow, see docs/tutorial.md.

CLI commands

CommandRole
mrag init [PROJECT_DIR]Initialize a project
mrag add <path>Add one document, or a directory with --recursive
mrag indexBuild the index
mrag reindexRebuild the index
mrag search <query>Run a search
mrag eval <query>Evaluate retrieval quality
mrag serveStart the HTTP API server
mrag mcpExpose the project as a read-only MCP server
mrag remove <doc-id>Remove a document
mrag exclusions add | list | restoreRetain a document while excluding it from retrieval
mrag profiles list | show <name>List or show profile details
mrag kb-info show | validate | schemaManage the knowledge-base self-description
mrag inspect document | chunks | chunk | sectionsInspect the index internals
mrag registry generate | validateManage the multi-KB registry
mrag extract <file>Run text extraction only
mrag show-extracted <doc-id>Show the extracted text
mrag export-extracted <doc-id>Export the extracted text to a file
mrag doctorCheck the environment

Run mrag <command> --help for the full set of options.

For directory ingestion, preview with mrag add <dir> --recursive --dry-run --json, then apply the same selection without --dry-run. See recursive directory ingestion for filtering, symlink, duplicate, concurrency, and partial-success behavior.

To stop a retained document from contributing knowledge, use the dry-run-first mrag exclusions workflow instead of mrag remove. See document retrieval exclusions for cleanup, restoration, and failure semantics.

Documentation

Per-feature details live under ./docs/.

Getting Started

  • tutorial.md — Your first mrag session (init → add → index → search)
  • recursive-add.md — Safe bulk ingestion with filters and deterministic reporting

Retrieval

Operations

API

  • mcp.md — Model Context Protocol server (mrag mcp)
  • dify-api.md — Dify External Knowledge API compatible endpoint
  • native-api.md — mrag Native REST API

Deployment

  • packaging.md — Single-binary packaging with PyInstaller (optional distribution method)

License

Copyright (c) 2026 BathTimeFish KK.

Licensed under the MIT License.

Releases up to and including 0.27.0 were licensed under AGPL-3.0, a condition of the PyMuPDF dependency that 1.0.0 removed.

Third-party dependency licenses are listed in THIRD_PARTY_NOTICES.md.

Acknowledgements

mrag uses sqlite-vaporetto by @hotchpotch for Japanese morphological tokenization via SQLite FTS5.

  • sqlite-vaporetto — licensed under MIT OR Apache-2.0
  • bundled model (bccwj-suw+unidic_pos+kana.model.zst, included in -with-model releases) — licensed under BSD-3-Clause, sourced from daac-tools/vaporetto-models

If you redistribute mrag together with the sqlite-vaporetto library or its bundled model, the BSD-3-Clause copyright notice for the model must be included in your distribution.

About

A lightweight local-first retrieval runtime for building RAG pipelines

Resources

Stars

8 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

English / 日本語

mrag — Micro RAG

A lightweight, local-first retrieval runtime for building RAG pipelines.

mrag is a CLI for building and operating small-scale RAG knowledge bases. It provides everything from document indexing to search, with a variety of strategies for building custom RAG pipelines to fit your needs. Skills for AI agents let you expose your knowledge base to any AI agent.

mrag ingests Markdown and plain text. Converting other formats is the job of a document conversion engine such as docling or MarkItDown; run one of those first and feed mrag the Markdown it produces.


Release notes, including breaking changes and upgrade steps, live in CHANGELOG.md.


Requirements

ComponentNotes
Python 3.11+
Ollamaollama serve must be running. Defaults use bge-m3 for embeddings and gemma4:e2b for contextual augmentation
QdrantThe default local mode runs Qdrant in-process. Docker Qdrant is required only when qdrant.mode: server is set

Installation

git clone https://github.com/bathtimefish/mrag.git
cd mrag

You can run an agent such as Claude Code in the cloned directory and have it read SETUP.md to complete the setup automatically.

The manual setup steps are below.

We recommend uv for installing Python modules:

uv venv
uv pip install -e ".[vaporetto,reranker]"

This installs the standard configuration that includes Japanese morphological tokenization (vaporetto) and CrossEncoder reranking (reranker).

Vaporetto native library

The vaporetto extra installs apsw (for SQLite extension loading), but the native shared library must be placed separately.

  1. Download the latest -with-model.tar.gz that matches your OS / architecture from sqlite-vaporetto releases (use the model-bundled variant).

  2. Extract the archive and place the shared library under ~/.mrag/extensions/:

    mkdir -p ~/.mrag/extensions
    cp libsqlite_vaporetto.dylib ~/.mrag/extensions/ # macOS# cp libsqlite_vaporetto.so ~/.mrag/extensions/ # Linux

To use a custom path, set the environment variable:

export MRAG_VAPORETTO_LIB=/path/to/libsqlite_vaporetto.dylib

If vaporetto is not detected when you run mrag init, mrag falls back to the trigram tokenizer automatically. Run mrag doctor to verify the detection state.

Pull the embedding model

ollama pull bge-m3

bge-m3 is a multilingual model that supports Japanese and English (1024 dimensions). You can swap it for any Ollama-compatible model by editing profiles/default.yaml.

Quick Start

Four mrag commands are all it takes to create a KB from a directory and search it:

mrag init my-kb --non-interactive
cd my-kb
mrag add /path/to/documents --recursive --include '**/*.md'
mrag index
mrag search "your query"

Pass a single file instead of a directory when bulk ingestion is unnecessary. Adding and indexing are intentionally separate operations.

For step-by-step details and the agent-integration workflow, see docs/tutorial.md.

CLI commands

CommandRole
mrag init [PROJECT_DIR]Initialize a project
mrag add <path>Add one document, or a directory with --recursive
mrag indexBuild the index
mrag reindexRebuild the index
mrag search <query>Run a search
mrag eval <query>Evaluate retrieval quality
mrag serveStart the HTTP API server
mrag mcpExpose the project as a read-only MCP server
mrag remove <doc-id>Remove a document
mrag exclusions add | list | restoreRetain a document while excluding it from retrieval
mrag profiles list | show <name>List or show profile details
mrag kb-info show | validate | schemaManage the knowledge-base self-description
mrag inspect document | chunks | chunk | sectionsInspect the index internals
mrag registry generate | validateManage the multi-KB registry
mrag extract <file>Run text extraction only
mrag show-extracted <doc-id>Show the extracted text
mrag export-extracted <doc-id>Export the extracted text to a file
mrag doctorCheck the environment

Run mrag <command> --help for the full set of options.

For directory ingestion, preview with mrag add <dir> --recursive --dry-run --json, then apply the same selection without --dry-run. See recursive directory ingestion for filtering, symlink, duplicate, concurrency, and partial-success behavior.

To stop a retained document from contributing knowledge, use the dry-run-first mrag exclusions workflow instead of mrag remove. See document retrieval exclusions for cleanup, restoration, and failure semantics.

Documentation

Per-feature details live under ./docs/.

Getting Started

  • tutorial.md — Your first mrag session (init → add → index → search)
  • recursive-add.md — Safe bulk ingestion with filters and deterministic reporting

Retrieval

Operations

API

  • mcp.md — Model Context Protocol server (mrag mcp)
  • dify-api.md — Dify External Knowledge API compatible endpoint
  • native-api.md — mrag Native REST API

Deployment

  • packaging.md — Single-binary packaging with PyInstaller (optional distribution method)

License

Copyright (c) 2026 BathTimeFish KK.

Licensed under the MIT License.

Releases up to and including 0.27.0 were licensed under AGPL-3.0, a condition of the PyMuPDF dependency that 1.0.0 removed.

Third-party dependency licenses are listed in THIRD_PARTY_NOTICES.md.

Acknowledgements

mrag uses sqlite-vaporetto by @hotchpotch for Japanese morphological tokenization via SQLite FTS5.

  • sqlite-vaporetto — licensed under MIT OR Apache-2.0
  • bundled model (bccwj-suw+unidic_pos+kana.model.zst, included in -with-model releases) — licensed under BSD-3-Clause, sourced from daac-tools/vaporetto-models

If you redistribute mrag together with the sqlite-vaporetto library or its bundled model, the BSD-3-Clause copyright notice for the model must be included in your distribution.

About

A lightweight local-first retrieval runtime for building RAG pipelines

Resources

Stars

8 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

English / 日本語

mrag — Micro RAG

A lightweight, local-first retrieval runtime for building RAG pipelines.

mrag is a CLI for building and operating small-scale RAG knowledge bases. It provides everything from document indexing to search, with a variety of strategies for building custom RAG pipelines to fit your needs. Skills for AI agents let you expose your knowledge base to any AI agent.

mrag ingests Markdown and plain text. Converting other formats is the job of a document conversion engine such as docling or MarkItDown; run one of those first and feed mrag the Markdown it produces.


Release notes, including breaking changes and upgrade steps, live in CHANGELOG.md.


Requirements

ComponentNotes
Python 3.11+
Ollamaollama serve must be running. Defaults use bge-m3 for embeddings and gemma4:e2b for contextual augmentation
QdrantThe default local mode runs Qdrant in-process. Docker Qdrant is required only when qdrant.mode: server is set

Installation

git clone https://github.com/bathtimefish/mrag.git
cd mrag

You can run an agent such as Claude Code in the cloned directory and have it read SETUP.md to complete the setup automatically.

The manual setup steps are below.

We recommend uv for installing Python modules:

uv venv
uv pip install -e ".[vaporetto,reranker]"

This installs the standard configuration that includes Japanese morphological tokenization (vaporetto) and CrossEncoder reranking (reranker).

Vaporetto native library

The vaporetto extra installs apsw (for SQLite extension loading), but the native shared library must be placed separately.

  1. Download the latest -with-model.tar.gz that matches your OS / architecture from sqlite-vaporetto releases (use the model-bundled variant).

  2. Extract the archive and place the shared library under ~/.mrag/extensions/:

    mkdir -p ~/.mrag/extensions
    cp libsqlite_vaporetto.dylib ~/.mrag/extensions/ # macOS# cp libsqlite_vaporetto.so ~/.mrag/extensions/ # Linux

To use a custom path, set the environment variable:

export MRAG_VAPORETTO_LIB=/path/to/libsqlite_vaporetto.dylib

If vaporetto is not detected when you run mrag init, mrag falls back to the trigram tokenizer automatically. Run mrag doctor to verify the detection state.

Pull the embedding model

ollama pull bge-m3

bge-m3 is a multilingual model that supports Japanese and English (1024 dimensions). You can swap it for any Ollama-compatible model by editing profiles/default.yaml.

Quick Start

Four mrag commands are all it takes to create a KB from a directory and search it:

mrag init my-kb --non-interactive
cd my-kb
mrag add /path/to/documents --recursive --include '**/*.md'
mrag index
mrag search "your query"

Pass a single file instead of a directory when bulk ingestion is unnecessary. Adding and indexing are intentionally separate operations.

For step-by-step details and the agent-integration workflow, see docs/tutorial.md.

CLI commands

CommandRole
mrag init [PROJECT_DIR]Initialize a project
mrag add <path>Add one document, or a directory with --recursive
mrag indexBuild the index
mrag reindexRebuild the index
mrag search <query>Run a search
mrag eval <query>Evaluate retrieval quality
mrag serveStart the HTTP API server
mrag mcpExpose the project as a read-only MCP server
mrag remove <doc-id>Remove a document
mrag exclusions add | list | restoreRetain a document while excluding it from retrieval
mrag profiles list | show <name>List or show profile details
mrag kb-info show | validate | schemaManage the knowledge-base self-description
mrag inspect document | chunks | chunk | sectionsInspect the index internals
mrag registry generate | validateManage the multi-KB registry
mrag extract <file>Run text extraction only
mrag show-extracted <doc-id>Show the extracted text
mrag export-extracted <doc-id>Export the extracted text to a file
mrag doctorCheck the environment

Run mrag <command> --help for the full set of options.

For directory ingestion, preview with mrag add <dir> --recursive --dry-run --json, then apply the same selection without --dry-run. See recursive directory ingestion for filtering, symlink, duplicate, concurrency, and partial-success behavior.

To stop a retained document from contributing knowledge, use the dry-run-first mrag exclusions workflow instead of mrag remove. See document retrieval exclusions for cleanup, restoration, and failure semantics.

Documentation

Per-feature details live under ./docs/.

Getting Started

  • tutorial.md — Your first mrag session (init → add → index → search)
  • recursive-add.md — Safe bulk ingestion with filters and deterministic reporting

Retrieval

Operations

API

  • mcp.md — Model Context Protocol server (mrag mcp)
  • dify-api.md — Dify External Knowledge API compatible endpoint
  • native-api.md — mrag Native REST API

Deployment

  • packaging.md — Single-binary packaging with PyInstaller (optional distribution method)

License

Copyright (c) 2026 BathTimeFish KK.

Licensed under the MIT License.

Releases up to and including 0.27.0 were licensed under AGPL-3.0, a condition of the PyMuPDF dependency that 1.0.0 removed.

Third-party dependency licenses are listed in THIRD_PARTY_NOTICES.md.

Acknowledgements

mrag uses sqlite-vaporetto by @hotchpotch for Japanese morphological tokenization via SQLite FTS5.

  • sqlite-vaporetto — licensed under MIT OR Apache-2.0
  • bundled model (bccwj-suw+unidic_pos+kana.model.zst, included in -with-model releases) — licensed under BSD-3-Clause, sourced from daac-tools/vaporetto-models

If you redistribute mrag together with the sqlite-vaporetto library or its bundled model, the BSD-3-Clause copyright notice for the model must be included in your distribution.

About

A lightweight local-first retrieval runtime for building RAG pipelines

Resources

Stars

8 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages