Native ads for AI—semantic matching, not keyword hacks.
LLM-ready sponsor inserts via MCP
Most ad systems are brittle because they match strings. LLM apps need meaning-based matching.
AdKit is a lightweight semantic ad engine: your LLM app requests relevant sponsor inserts using natural language context, and AdKit matches ads semantically using embeddings + vector search. It applies typed constraints (topics, locale, vertical, exclusions, policy flags). Your agent calls a tiny MCP tool surface: match, explain, health, capabilities.
What you get: higher relevance, cleaner architecture, and guardrails that keep production sane.
Monetize without ruining trust.
Ads that feel native to the conversation or page, not jarring interruptions.
Add sponsors without hand-built rules or constant maintenance.
Answer "why did this ad show up?" with a full audit trace.
Runtime stays read-only. No surprises in production.
If your AI product is going to scale, you can't have monetization tied to fragile heuristics and ad-hoc scripts.
AdKit is for teams building:
Customer support, internal ops, sales, shopping—any agent that benefits from relevant sponsor inserts.
Systems that want "sponsored context" alongside organic retrieval results.
"You might also like" or affiliate inserts based on meaning—not keywords.
Chat turns, page content, query text—anything the user is currently doing.
Embeds the context locally, retrieves candidates from Qdrant, then filters by targeting and policy.
Inline, sidebar, banner, feed—your UI stays in control.
Most "monetization plugins" become a security disaster because runtime can mutate data. AdKit splits responsibilities: Data Plane (runtime) = read-only ad matching; Control Plane (admin) = ingestion, provisioning, admin operations. That separation is the difference between a prototype and something you can put into production.
Ad matching, read-only retrieval
Called by: LLMs / Agents
uv run ad-mcp-dataProvisioning, ingestion, admin ops
Called by: Humans, CI/CD, backoffice
uv run ad-mcp-controlFor repository structure and setup details, see the Technical Deep Dive.
Ads match the meaning of the context, not keywords.
Topics, locale, verticals, exclusions, policy flags (e.g., sensitive / age-restricted handling).
Every match can return an audit trace via ads_explain: why eligible, why others rejected,
filters applied, similarity score.
Runtime exposes only allowlisted tools: ads_match, ads_explain,
ads_health, ads_capabilities. No destructive ops at runtime. Period.
Typical setup (local → production)
Install uv, start Qdrant, sync dependencies, create the collection, and seed demo ads.
# Install uv (macOS/Linux) curl -LsSf https://astral.sh/uv/install.sh | sh # Start Qdrant docker run -d --name qdrant -p 6333:6333 -p 6334:6334 qdrant/qdrant # Sync deps, create collection, seed ads uv sync uv run ad-index create uv run ad-index seed uv run ad-index info # Verify: Points count should be 5 # Run Data Plane (LLM-facing) uv run ad-mcp-data
Wire ads_match into your agent’s tool surface. Pass conversation context, page content,
or query text.
Use the Control Plane to ingest ads, set topics, locale, verticals, and exclusions.
Configure policy flags, add monitoring, and deploy. You control placement and rendering—AdKit just returns candidates.
You control placement and rendering. AdKit just returns candidates.
AdKit is built with a hard boundary:
MCP_DATA_KEY,
MCP_ADMIN_KEY)This is what you want if you’re selling into enterprise environments or regulated verticals.
ads_explain returns an audit trace tied to a specific match.