Local embeddings, vector retrieval, dual-plane architecture, and setup details for engineers.
AdKit is built on a few core components. Context embedding stays local; storage and retrieval use your own infrastructure.
Context is embedded locally—no third-party API calls. FastEmbed runs in-process for low latency.
Ads are stored as vectors in Qdrant. Semantic search returns candidates by similarity score.
Topics, locale, verticals, exclusions, policy flags. Filters are applied after retrieval.
Data Plane (runtime) = read-only matching. Control Plane (admin) = ingestion and provisioning. Data Plane allowlist prevents destructive/admin tools at runtime.
Two separate MCP server processes. Runtime never mutates data—that’s the security boundary.
Ad matching, read-only retrieval. Called by LLMs / Agents.
uv run ad-mcp-dataProvisioning, ingestion, admin. Called by Humans, CI/CD.
uv run ad-mcp-controlData Plane allowlist: only ads_match,
ads_explain, ads_health, ads_capabilities. No destructive ops at runtime.
Core modules and responsibilities.
Prerequisites: Python 3.10+, uv, Docker (for Qdrant).
# macOS/Linux curl -LsSf https://astral.sh/uv/install.sh | sh # Windows (PowerShell) powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" # Or with pip pip install uv
docker run -d --name qdrant -p 6333:6333 -p 6334:6334 qdrant/qdrant docker ps --filter name=qdrant
uv sync
uv run ad-index create
uv run ad-index seed
uv run ad-index info # Verify: Points count should be 5
# Data Plane (LLM-facing, read-only) uv run ad-mcp-data # Control Plane (admin, separate terminal) uv run ad-mcp-control