Labsco
jsbroks logo

RAGSync

from jsbroks

Index your docs, files, and websites into a vector store and give your AI agent live semantic search with auto-syncs on changes, zero code required.

๐Ÿ”ฅ๐Ÿ”ฅ๐Ÿ”ฅโœ“ VerifiedAccount requiredNeeds API keys

RAGSync

Configuration-driven RAG MCP server โ€” ingest, watch, and search arbitrary knowledge sources behind a stable tool surface.


Features

  • Broad source support โ€” index local folders (text, PDF, Markdown) and web pages; not limited to a single file type or format
  • Config-driven โ€” one YAML file defines sources, chunking strategy, embedding model, and vector store; no code required
  • Live reload โ€” filesystem watching and polling keep the index current as sources change; editing the config itself applies changes without a restart
  • Flexible embeddings โ€” local fastembed works out of the box with no API key; swap in OpenAI or Voyage per source
  • Stable MCP tool surface โ€” five source-agnostic tools (search, list_sources, get_document, get_index_status, reindex) that never change as sources are added

MCP tools

Five tools, deliberately small and source-agnostic. They never change as sources are added:

  • search โ€” semantic search across one or all sources, with optional metadata filtering. Returns results with normalized [0, 1] scores.
  • list_sources โ€” discover available sources and their health/metadata.
  • get_document โ€” fetch a full document after search surfaces a chunk.
  • get_index_status โ€” indexing freshness/health for one source or all.
  • reindex โ€” force a full re-scan of a source.

Tools return structured {"error": "..."} objects rather than raising, so the calling agent can recover conversationally.

Access scoping

Per-source isolation is a security boundary: scope access by running separate server instances with separate configs. There is no cross-instance "search everything" path.

Development

uv sync --extra dev          # install test dependencies
uv run pytest

Tests run fully offline by injecting a deterministic embedder in place of fastembed (see tests/conftest.py). The architecture and extension contract โ€” how to add a new source type โ€” are documented in AGENTS.md.

Releasing

Releases are automated from Conventional Commits. CI (.github/workflows/ci.yml) runs the test suite on every pull request. On merge to main, the release workflow (.github/workflows/release.yml) runs the tests again, then python-semantic-release inspects the commits since the last tag and decides the next version:

Commit typeExampleVersion bump
fix:fix: handle empty PDF pagespatch โ€” 0.1.0 โ†’ 0.1.1
feat:feat: add notion loaderminor โ€” 0.1.0 โ†’ 0.2.0
feat!: / BREAKING CHANGE:feat!: drop python 3.9major โ€” 0.1.0 โ†’ 1.0.0
docs: / chore: / test: / ci: / refactor:โ€”no release

When there is a releasable change it bumps version in pyproject.toml, updates CHANGELOG.md, tags the commit, creates a GitHub release, and publishes the package to PyPI. Once published, anyone can run it with uvx ragsync --config <path> (or pip install ragsync).