vexicon
About
Hybrid knowledge store, usable as a Python library or as an MCP server.
Notes and reference material live in named spaces backed by Chroma collections. Each space also has a SQLite FTS5 keyword index, and searches fuse the vector and keyword rankings with reciprocal rank fusion, tunable through settings.
vexicon ships opinionated defaults, listed under Defaults below.
Run the server over stdio with uvx "vexicon[mcp]".
Use as a library
Install vexicon without extras. HybridClient takes the same settings as
the server, as constructor arguments, and must be entered before use.
Entering migrates the keyword index and rebuilds it from Chroma.
from pathlib import Path
from vexicon import HybridClient, NewEntry
with HybridClient(Path("~/.vexicon/chroma"), Path("~/.vexicon/hybrid.db")) as client:
client.create_space("notes", readme="Short facts.")
client.add_entries("notes", [NewEntry(id="cats-purr", text="Cats purr.")])
for entry in client.search("notes", ["purring"], limit=5):
print(entry.id, entry.text)
AsyncHybridClient has the same methods as coroutines and is entered with
async with. Both raise VexiconError subclasses for caller mistakes such
as a duplicate entry ID or a filter Chroma would reject.
Add to an MCP client
The first launch downloads vexicon's dependencies, which can take longer than a client's startup timeout. Each client below shows how to raise it.
Claude Code
claude mcp add --scope user vexicon -- uvx "vexicon[mcp]"
Pass settings with -e:
claude mcp add --scope user vexicon -e VEXICON_DEVICE=cpu -- uvx "vexicon[mcp]"
Claude Code's startup timeout is 30 seconds. Raise it with MCP_TIMEOUT in
milliseconds:
MCP_TIMEOUT=120000 claude
Codex
codex mcp add vexicon -- uvx "vexicon[mcp]"
Pass settings with --env:
codex mcp add vexicon --env VEXICON_DEVICE=cpu -- uvx "vexicon[mcp]"
Codex's startup timeout is 10 seconds. Raise it in ~/.codex/config.toml:
[mcp_servers.vexicon]
command = "uvx"
args = ["vexicon[mcp]"]
startup_timeout_sec = 120
Settings
| Variable | Default | Meaning |
|---|---|---|
VEXICON_PERSISTENT_PATH |
~/.vexicon/chroma |
Directory where Chroma stores its database. |
VEXICON_INDEX_DB_PATH |
~/.vexicon/hybrid.db |
SQLite file holding the keyword index. |
VEXICON_VECTOR_WEIGHT |
1.0 |
Weight of the vector ranking in fusion. |
VEXICON_KEYWORD_WEIGHT |
1.0 |
Weight of the keyword ranking in fusion. |
VEXICON_RRF_RANK_OFFSET |
60 |
Rank offset in reciprocal rank fusion. |
VEXICON_DEVICE |
auto |
Device that runs embedding models: auto, cpu, or cuda. |
VEXICON_IDLE_SECONDS |
300 |
Seconds without activity before Chroma and embedding models are unloaded. |
Compared with chroma-mcp
Compared against chroma-mcp 0.2.6 and chromadb 1.5.9.
Hybrid search without Chroma Cloud
- vexicon combines vector and BM25 keyword rankings with reciprocal rank fusion, using a SQLite FTS5 index beside each local Chroma collection.
Token usage
- vexicon's tool definitions take about 30% fewer tokens than chroma-mcp's.
searchreturns at mostlimitentries in total, while chroma-mcp returnsn_resultsper query, so its response grows with every query a model adds.- Results always leave out embedding vectors, which add tokens without giving a model anything it can use.
Embedding models
- Each space can use any sentence-transformers model, and tools let a model find and download one from Hugging Face.
- Cached models load without network calls.
- Models trained with separate query and document prompts get the matching prompt for searches and for stored entries.
- Spaces always have their embedding model's max token size available in metadata for sizing entries before they are added.
Memory
- Embedding models unload from memory after
VEXICON_IDLE_SECONDSwithout use.
Defaults
- Storage persists under
~/.vexiconby default. - Entry IDs are kebab-case mnemonics.
- Duplicate entry IDs raise an error.
- Spaces are published as MCP resources.
- Chroma telemetry is off.
vexicon keeps its own fields in Chroma metadata:
- Each entry's metadata holds
created_atin epoch seconds for recency filters inwhere. - Each space's metadata holds its
readme,embedding_repo_id, andembedding_max_tokens. - Callers cannot set those three keys through a space's
metadataargument. - Tool results show these fields apart from the caller's own metadata.
Metadata
Release files for vexicon 0.7.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| vexicon-0.7.0.tar.gz | 23.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| vexicon-0.7.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 58.3 kB
Release files / vexicon-0.7.0.tar.gz
| Download URL | vexicon-0.7.0.tar.gz |
|---|---|
| Size | 23.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8e621c5ff996c3533322e2a8a40a6c2deca6a70673f3e660583250f955e30282
|
|
BLAKE2b-256 checksum How to use checksums |
617b84ba55ac68f72e26e6a3e7235cadc551be634c60c500dd0ff969f37e259a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.22 {"installer":{"name":"uv","version":"0.12.22","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":null}
|
Release files / vexicon-0.7.0-py3-none-any.whl
| Download URL | vexicon-0.7.0-py3-none-any.whl |
|---|---|
| Size | 34.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
807c69e9b21fa62ef65c5ce20c5673d3e548b58eb86530e8e3250d27a0c73d0c
|
|
BLAKE2b-256 checksum How to use checksums |
2c77f9c9696f9914d9840bcbc8fad3ac423f0bbd5eed0669bb0fb01fd2b1afbb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.22 {"installer":{"name":"uv","version":"0.12.22","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":null}
|