# Contextator

> Contextator, bir projenin dokümanını nerede duruyorsa oradan alıp — bağlı bir klasör, bir git deposu, yüklenmiş bir arşiv, bir Obsidian kasası ya da bir Notion çalışma alanı — tek bir MCP ucunun arkasında aranabilir kılan, kendi sunucunuzda çalışan çok kiracılı bir doküman sunucusudur. Her proje kendi URL'ini ve kendi doküman koleksiyonunu alır; embedding'ler varsayılan olarak makinenin CPU'sunda üretilir ve doküman üçüncü bir tarafa hiç gitmez.

- Rolüm: Founder & Developer
- Sınıf: Amiral Gemileri
- Durum: Devam ediyor
- Başlangıç: 2026-09-17
- Teknolojiler: TypeScript, Node.js, Fastify, PostgreSQL, pgvector, Drizzle ORM, MCP, transformers.js, Docker, Notion API, Vitest, Biome
- Yetenekler: MCP Server Development, Retrieval System Design, Multi-Tenant Architecture, Vector Search, Hybrid Search, Embedding Pipelines, Document Parsing, Incremental Indexing, Self-Hosted Deployment, Access Control, Open Source Maintenance, Evaluation Harness Design
- Web sitesi: https://contextator.com
- Kaynak kodu: https://github.com/Contextator/Contextator
- Kaynak: https://www.muhammetsafak.com.tr/portfolyo/contextator/
- Dil: tr-TR
- Yazar: Muhammet Şafak

---
Contextator, bir kodlama ajanının projenin dokümanına ulaşması için dokümanı bir yere taşımak gerekmesin diye geliştirdiğim açık kaynak bir MCP sunucusudur. Vaadi tek cümleyle şu: bir projeye kaynaklarını verirsiniz — sunucuda bağlı bir klasör, bir git deposu ya da onun tek bir alt dizini, yüklenmiş bir `.zip`/`.tar.gz`/`.rar` arşivi, bir Obsidian kasası veya bir Notion çalışma alanı — ve o proje `/mcp/<proje-adı>` adresinde kendi Model Context Protocol ucu hâline gelir. Claude Code, Cursor, Claude Desktop ya da MCP konuşan herhangi bir istemci o uca bağlanır ve üç araçla çalışır: `search_docs` anlamsal arama yapar, `list_topics` indekslenmiş dokümanları dizinlerine göre listeler, `read_document` bir dosyayı ya da onun tek bir bölümünü döndürür. Her kaynak kendi adının altına monte edildiği için bir doküman `handbook/install.md` diye okunur ve `/mcp/billing`'e bağlı bir istemci `/mcp/mobile`'ı hiç görmez.

Mimarinin merkezinde üç karar var. **Yalıtım adresin kendisidir:** her proje kendi URL'ini ve kendi doküman koleksiyonunu taşır, bu yüzden projeler arası arama tasarım gereği yoktur — alternatifi tek uca bir `project` parametresi koymaktı ve o tasarımda yalıtım ajanın doğru parametreyi göndermesine bağlı kalırdı. **Varsayılan yol dışarıya çıkmaz:** embedding'ler `Xenova/multilingual-e5-small` ile makinenin CPU'sunda üretilir (384 boyut, Türkçe dâhil çok dilli bir retrieval modeli); birkaç ortam değişkeniyle OpenAI embedding'lerine geçilebilir ama çalışmak için hiçbir API anahtarı gerekmez. **Arama iki dizine birden sorar:** bir cümle modeli bir sabit adını ya da hata kodunu temsil edemediği için her chunk hem HNSW vektör dizininde hem tam metin dizininde durur ve bir arama iki listenin sıralamalarını birleştirir — skorları değil sıralamaları, çünkü skor ağırlıkları embedding modeli her değiştiğinde yeniden öğrenilmek zorunda kalırdı. Dosyalar sha256 ile izlenir: yalnız değişen dosya yeniden gömülür, silinen dosyanın dokümanları düşer ve tam yeniden indeksleme canlı indeksin *yanına* yazılıp tek adımda yayına alınır, böylece proje bütün koşu boyunca cevap vermeye devam eder.

Ürün tek bir Docker container'ı olarak dağıtılır: PostgreSQL 16 + pgvector ve Node.js uygulaması aynı imajın içinde, küçük bir entrypoint betiğiyle birlikte ayağa kalkar ve birlikte durur — "kurulum tek komut olsun" kararının bedeli, tek-süreç ortodoksisinden bilinçli bir sapmadır. `.html`, `.docx`, `.csv` ve `.pdf` dosyaları indekslenirken Markdown'a çevrilir; metin katmanı olmayan taranmış bir PDF indekslenmez, reddedilir — çünkü fark edilmeyen başarısızlık, var olan ama hiçbir şeyle eşleşmeyen boş bir doküman üretendir. Hesap ve rol modeli `root`/`admin`/`member` üçlüsü ile proje başına `viewer`/`editor` üyeliğinden oluşur, her MCP ucu üç ayarlı bir kapı taşır (açık · bearer token · hesap gerektiren, OAuth 2.1 ile) ve retrieval kalitesi bir golden set üzerinden ölçülüp CI'da eşik altına düştüğünde derlemeyi düşürür. Lisans AGPL-3.0-or-later: değiştirilmiş bir sürümü ağ üzerinden sunan, o değişiklikleri aynı lisansla yayımlar.
