Local directory
A folder mounted into the container, scanned in place. Nothing is copied, and it is mounted read-only.
handbook/install.mdContextator merges a mounted folder, a git repository, an uploaded Obsidian vault and a Notion workspace into one semantically searchable MCP endpoint per project — running in a single Docker container on your own machine.
No account · No API key · No egress by default
A product's knowledge is genuinely spread across a repository, a wiki, a vault and an export. Every existing answer asks a human to consolidate first — which never happens.
Bounded by the context window, stale the moment it is pasted, and repeated by every developer on the team.
Fine for docs in the same checkout. Useless for the handbook in Notion, the API reference in another repository, the vault on an architect's laptop.
Solves retrieval by shipping internal documentation to a third party, one account per team, billed per query. For many organisations that ends the conversation.
Every team writes the same chunker, the same embedding loop, the same incremental indexer — and then maintains it.
An index run syncs every source, walks the result, chunks each file along its headings and embeds the chunks next to their document. Your question travels the same path in reverse.
Incremental. Files are hashed. Re-indexing an unchanged collection performs zero embeddings.
Isolated. Every query is scoped by project; a session issued for one is rejected on another.
Observable. Every run is persisted with its mode, counts, duration and error.
A project may hold any number of sources at once. Each one syncs on its own and fails on its own — a broken source never empties the index.
A folder mounted into the container, scanned in place. Nothing is copied, and it is mounted read-only.
handbook/install.mdA shallow single-branch checkout over HTTPS. Private repos with a token, one subdirectory if you like, re-indexed by push webhook.
api-repo/reference/auth.mdDrop files, whole folders or a .zip, .tar or .rar on the dashboard. Extracted with traversal and decompression-bomb guards.
spec-2024/overview.mdWikilinks in all their forms, callouts and %%comments%% flattened to ordinary Markdown before a single chunk is cut.
vault/architecture.mdEvery page shared with your integration, rendered to Markdown and kept in sync by last_edited_time.
notion/onboarding.mdA source's name is the first segment of every document it contributes. That is what tells the agent which repository an answer came from — and what lets two sources hold the same file name.
The agent gets a tiny, self-describing surface — so you ask a question instead of naming a tool. Complexity lives in the dashboard, where a human is looking.
search_docs(query, limit)Cosine-similarity search across the project's chunks. Ranked excerpts, each with its file path, heading breadcrumb and score — and an honest message instead of results when the project has nothing indexed.
list_topics()Everything the project holds, grouped by directory, with titles, chunk counts and the source each document came from. What an agent calls when it wants to know what exists before it searches.
read_document(path)The full Markdown of one indexed file, when an excerpt is not enough. Only paths that were indexed for that project are served — never an arbitrary filesystem path. Capped at 512 KB.
An agent cannot write, cannot reach another project, cannot read a file that was not indexed, and cannot trigger an index run. Indexing stays an operator action — dashboard, API or webhook.
Embeddings are computed on your CPU with a 384-dimension multilingual model. Once the model is cached, a default installation makes no outbound call at all.
Separate documents, separate embeddings, separate sessions. A client connected to /mcp/billing can never observe /mcp/mobile.
Every file carries the sha256 of its raw bytes. A re-index touches only what changed, so a push webhook on every merge stays cheap.
50+ languages including Turkish, and it matches across them: a Turkish question finds the English paragraph that answers it.
PostgreSQL 16 with pgvector ships inside the image, listening only on loopback. No database to install, and no migration command to run — ever.
Streamable HTTP and the legacy HTTP+SSE transport are served on the same address. The client picks whichever it speaks; you configure nothing.
Docker with Compose and a folder of Markdown. That is all — the database ships inside the container, and the only slow step happens once.
Cursor and Claude Desktop snippets are printed by the dashboard, already filled in.
Contextator is built for one deployment shape: your own network, your own operator. The documentation says so in plain words, and so does this page.
What is protected: accounts with root, admin and member roles; source tokens encrypted with AES-256-GCM and never readable again; per-source webhook secrets verified against the raw body before anything is queued; path containment on every read.
A project's MCP URL is unauthenticated until you put a bearer token on it. Whoever holds that token reads everything indexed in that project — it is a credential for an endpoint, not an account.
No PDFs, no Office documents, no images. Extraction quality varies too much per format to promise, and it would dominate the maintenance cost.
Projects are isolated end to end, deliberately. Two bodies of knowledge that belong to the same question become two sources of one project instead.
Contextator returns your documents faithfully; it does not sanitise intent. Treat the corpus you index as trusted input, because that is what it becomes.
Contextator cannot be closed. Every running instance serves the complete licence text at /license.txt.
Run it, study it, change it, share it. Using it inside your company asks nothing of you. Let other people reach your modified version over a network, and you owe those users its source.
Read the source on GitHubFor organisations whose policy forbids AGPL software, or who need to ship Contextator inside something closed. Granted by the copyright holder.
Ask at tunedness.comOne docker compose up -d, one project, one URL — and every agent on the team stops guessing.
AGPL-3.0-or-later · Docker · PostgreSQL 16 + pgvector · Node.js 22