Skip to main content

Lightweight MCP server for semantic search over organizational markdown

Project description

context-server

A lightweight MCP server for semantic search over markdown knowledge bases.

One Rust binary. ONNX Runtime is statically linked (via ort / fastembed) — no separate libonnxruntime.so to ship. SQLite is bundled. Built for AI coding agents (Claude Code, Cursor, etc.).

Features

  • Index markdown into a local SQLite vector database
  • Chunk by ## / ### headings (hierarchy kept in each chunk); oversized sections are split with overlap
  • Hybrid search: dense embeddings (All-MiniLM-L6-v2) + BM25, fused with reciprocal rank fusion
  • MCP tools: semantic_search, list_documents, answer_question
  • CLI for index / search / embed smoke tests

Input contract: feed searchable prose (markdown). Structured data (YAML, etc.) should be converted to markdown before indexing — raw YAML in code fences searches poorly.

Requirements

  • Rust 1.75+ (edition 2021)
  • Linux x86_64 (primary target today)
  • At build/link time: a C++ standard library (libstdc++) and OpenSSL development headers if your platform needs them for native-tls

On Fedora/RHEL, if the linker cannot find -lstdc++ (only libstdc++.so.6 is installed):

mkdir -p .linker && ln -sfn /usr/lib64/libstdc++.so.6 .linker/libstdc++.so
export RUSTFLAGS="-L native=$(pwd)/.linker"

Install

pip install context-server

Platform wheels: Linux x86_64/aarch64 (manylinux_2_39, glibc 2.39+ / Ubuntu 24.04+) and macOS Apple Silicon.

Build

cargo build --release

The first embedding run downloads the MiniLM model into the local Hugging Face / fastembed cache (~tens of MB, once).

Linux wheels (Podman)

Same Containerfile CI uses (Ubuntu 24.04 / glibc 2.39 — required by current ORT prebuilts):

./scripts/build-wheel.sh   # writes dist/*.whl
VERSION=2026.716.1 ./scripts/build-wheel.sh  # optional CalVer override

Releasing (CalVer)

Versions are CalVer YYYY.MMDD.N (e.g. 2026.716.1) so they are valid for both Cargo SemVer and PyPI. pyproject.toml takes the version from Cargo.toml; release CI rewrites that from the git tag before building.

tag="$(./scripts/next-calver.sh)"
git tag -a "$tag" -m "$tag"
git push origin "$tag"    # triggers Release workflow → PyPI

setuptools-scm is not used (maturin cannot consume it).

Usage

# Preview how documents will be chunked
./target/release/context-server index --input ./docs --dry-run

# Embed and write the database
./target/release/context-server index --input ./docs --db context.db

# Optional: store MCP server instructions in the DB (when to call this corpus)
./target/release/context-server index --input ./docs --db context.db \
  --instructions-file ./mcp-instructions.txt
# or: --instructions 'Call semantic_search for questions about …'

# CLI search (hybrid by default; also --mode dense|lexical)
./target/release/context-server search --db context.db "how do we handle backports"

# MCP stdio server
./target/release/context-server serve --db context.db

MCP instructions in the DB

index --instructions / --instructions-file writes meta.instructions. serve exposes that text as MCP ServerInfo.instructions so clients know when to call this corpus (falls back to a generic blurb if unset).

serve and search accept a remote --db and download it into the local cache ($XDG_CACHE_HOME/context-server/dbs/..., or ~/.cache/...) before opening:

# Short form (globally unique bucket)
context-server serve --db 'gs://vme-cnv-context/latest/cnv.db'

# Project-qualified (still requires gs://; stripped for the Storage API)
context-server serve --db \
  'gs://projects/itpc-gcp-hcm-pe-eng-claude/buckets/vme-cnv-context/objects/latest/cnv.db'

Uses Application Default Credentials (gcloud auth application-default login, or GOOGLE_APPLICATION_CREDENTIALS). When a sibling {object}.sha256 exists (sha256sum format), the download is skipped if the local cache already matches; otherwise the DB is re-fetched and verified. index still writes a local path only.

Claude Code

claude mcp add --transport stdio --scope user context-server \
  -- /absolute/path/to/context-server serve --db /absolute/path/to/context.db

Re-index when content changes, then restart the MCP session so serve reloads the DB into memory. For a GCS-backed DB, point --db at a gs://... URI.

If Claude rarely calls the tools (tool search defers MCP tools), add "alwaysLoad": true to the server entry in your Claude MCP config so these tools stay visible every turn.

MCP tools

Tool Description
semantic_search Ranked passages with similarity scores
list_documents Indexed chunk listing
answer_question Top passage for a question (retrieval only, no generative QA)

Architecture

Piece Choice
Embeddings fastembed → All-MiniLM-L6-v2, L2-normalized (model id stored in DB)
Inference ort (static ONNX Runtime)
Storage rusqlite (bundled SQLite), float32 blobs
Search Hybrid: cosine dense + BM25 → reciprocal rank fusion
Chunking ## / ### + split when text exceeds ~900 chars
MCP rmcp stdio

See PLAN.md for design notes and roadmap.

Development

cargo test
cargo build --release

License

MIT — see LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

context_server-2026.716.3.tar.gz (57.9 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

context_server-2026.716.3-py3-none-manylinux_2_39_x86_64.whl (17.4 MB view details)

Uploaded Python 3manylinux: glibc 2.39+ x86-64

context_server-2026.716.3-py3-none-manylinux_2_39_aarch64.whl (17.8 MB view details)

Uploaded Python 3manylinux: glibc 2.39+ ARM64

context_server-2026.716.3-py3-none-macosx_11_0_arm64.whl (13.4 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

File details

Details for the file context_server-2026.716.3.tar.gz.

File metadata

  • Download URL: context_server-2026.716.3.tar.gz
  • Upload date:
  • Size: 57.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for context_server-2026.716.3.tar.gz
Algorithm Hash digest
SHA256 c7ba2b34c59468691373e22a55ea26cc786a6336355dd5642f94cb83e384c073
MD5 9d56f8b904a279806ac618162168d485
BLAKE2b-256 c3522bca086938de03c5b34f9a73f9266598ea39dd6927d7783bafbf9776fc83

See more details on using hashes here.

File details

Details for the file context_server-2026.716.3-py3-none-manylinux_2_39_x86_64.whl.

File metadata

  • Download URL: context_server-2026.716.3-py3-none-manylinux_2_39_x86_64.whl
  • Upload date:
  • Size: 17.4 MB
  • Tags: Python 3, manylinux: glibc 2.39+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for context_server-2026.716.3-py3-none-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 51c296bebff28456bbb89d20ce420c4b89c7e7c6ea6bf0b03bc29367aa143738
MD5 0919abf6d6ff27ecffa7adb978326d91
BLAKE2b-256 9b2560344003d78bc0299e8aefd74bf58418e82da11a4a9f417e6f3e0550a9a9

See more details on using hashes here.

File details

Details for the file context_server-2026.716.3-py3-none-manylinux_2_39_aarch64.whl.

File metadata

  • Download URL: context_server-2026.716.3-py3-none-manylinux_2_39_aarch64.whl
  • Upload date:
  • Size: 17.8 MB
  • Tags: Python 3, manylinux: glibc 2.39+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for context_server-2026.716.3-py3-none-manylinux_2_39_aarch64.whl
Algorithm Hash digest
SHA256 ee0a109929c2c43b0068302d483ef8695b089692a94cbb870e9ccd8cafd0b5ac
MD5 2a319cb99ddf49f699e3c7873eb74b1a
BLAKE2b-256 a8d2cef25f5b6f561e6a03118f07411342b58565d6cf86a806cf485d9e88a612

See more details on using hashes here.

File details

Details for the file context_server-2026.716.3-py3-none-macosx_11_0_arm64.whl.

File metadata

  • Download URL: context_server-2026.716.3-py3-none-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 13.4 MB
  • Tags: Python 3, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for context_server-2026.716.3-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0a75ec50e62587b3baa351b73f01beb571cef9130612813358c57da24c474d74
MD5 68bffb08f4b9093a7386d137e693511c
BLAKE2b-256 dcb8968bd097564e30fdd659929649d5c977d7f2feecd204568f9982a32aa112

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page