Contextator
ENTR

About

Updated:

Contextator turns documentation into a searchable endpoint that AI agents can talk to. Point a project at a folder, a git repository, an upload, a Notion workspace or a Confluence site, and it becomes its own Model Context Protocol server that Claude Code, Cursor, Claude Desktop and any other MCP client can search semantically.

What it does

  • One URL per project, fully isolated. Every project keeps its own documents and vector embeddings; a client connected to /mcp/billing never sees /mcp/mobile.
  • Many sources per project. A mounted directory, a git repository (or one subdirectory of it), uploaded files and archives, a Notion workspace or a Confluence site — combined into one searchable endpoint, each source mounted under its own name.
  • Semantic search, not grep. Documents are chunked with their heading breadcrumbs intact and embedded into PostgreSQL with pgvector, so an agent finds the passage that answers the question rather than the page that repeats the keyword.
  • Incremental indexing. Files are hashed; only what changed is re-embedded, and deleted files disappear from the index. A push webhook can trigger a run on every commit.
  • Three tools for the agent. search_docs for ranked excerpts, list_topics for the document tree, read_document for the full Markdown of one indexed file.

How it works

An index run syncs each source first — fetching a git branch, pulling Notion pages, reading a mounted folder — then walks the result, converts each file to Markdown where it is not already (HTML, Word, CSV and PDF are), chunks it along its headings, embeds the chunks and stores them next to their document. When an agent asks a question, the question is embedded the same way and answered by a hybrid search — vector and keyword, fused by rank — over that project’s chunks alone.

Embeddings are generated locally on the CPU by default, with a multilingual model that covers 100 languages. Nothing about your documents is sent anywhere unless you deliberately switch the embedding provider to a hosted API.

Principles

  • Self-hosted first. One Docker container holds the database and the app. Your documents stay on your infrastructure.
  • Local by default. The default setup makes no outbound call once the embedding model has been downloaded.
  • Boring on purpose. The dashboard is vanilla HTML, CSS and ES modules with no build step; the server is TypeScript on Node.js.
  • Accounts and roles. The dashboard signs people in with their own account. root and admin manage everything; a member sees only the projects it is added to, reading them or editing them.
  • A door on each endpoint. A new project’s MCP endpoint is closed: token required is the default and asks for a bearer token you hand out — scoped to one project, shown once and revocable. Account required asks for an account of this instance, signing in over OAuth 2.1 and checked on every request; open is a setting you choose per project, deliberately.
  • Honest about limits. A token is a credential for the endpoint, not an account: whoever holds it reads everything indexed in that project, and a project left open is readable by anyone who can reach its URL.

Built with

TypeScript · Node.js 20+ · Fastify 5 · PostgreSQL 16 with pgvector · Drizzle ORM · @modelcontextprotocol/sdk · transformers.js.

Who builds it

Contextator is designed and developed by Muhammet Şafak and published as a Tunedness production. The software is free and open source under the GNU Affero General Public License v3: anyone may use it, study it, change it and run it, and any modified version that people reach over a network has to offer its source in turn — Contextator cannot be closed. A separate commercial licence is available for cases where those terms do not fit.

Arrow keys to move, Enter to open.