Back to work

Semantiq

Open-source MCP server for semantic code analysis

The breakdown.

Background

Semantiq — an MCP server I built because I needed it. It gives AI assistants actual code understanding. Not just grep — structural awareness. It knows what a function does, where it's called, what depends on it.

The root problem: AI coding assistants are powerful but blind. They see files as text. "Find where this function is used" runs grep over thousands of files. Semantiq gives them structure.

Semantiq landing page
Dark theme. Dev tools in light mode make a choice I disagree with.

How it went down

Frustration — Weeks working with Claude Code on large codebases, hitting the same wall. The AI had the intelligence but not the infrastructure.

Prototype — First proof-of-concept in Rust: parse TypeScript with Tree-sitter, index the symbols. It worked.

Building — Developed the Rust core, implemented MCP protocol, added multi-language support. Daily testing in my own workflow.

Landing page — Next.js site to present the tool. Dark theme, integrated docs, install command visible in 30 seconds.

Open source — MIT. Everything's in the repo.

Architecture

The core is a Rust workspace with 6 crates:

The 6 crates

  • semantiq — CLI binary (clap), HTTP API (axum)
  • semantiq-mcp — MCP server (rmcp), tool handlers
  • semantiq-parser — Tree-sitter parsing, symbol/chunk/import extraction
  • semantiq-index — SQLite storage (rusqlite, FTS5, sqlite-vec)
  • semantiq-retrieval — Search engine, query expansion, ranking
  • semantiq-embeddings — ONNX model (feature-gated)

The flow

  1. Indexing — Walk project → filter → Tree-sitter parse → extract symbols → SQLite (FTS5 + embeddings)
  2. Search — 3 cascading strategies: semantic (sqlite-vec KNN) → symbol (FTS5 MATCH) → text (grep if not enough results)
  3. Serving — MCP over stdio OR HTTP API (mutually exclusive)

Embedding

all-MiniLM-L6-v2 model (384-dim, ~90MB). Downloaded from HuggingFace on first run. Feature-gated — without the onnx flag, it's a stub returning empty vectors.

The 4 MCP tools

Each tool does one thing well:

semantiq_search — Semantic search. Not grep. Understands symbol types, scope, relevance.

semantiq_find_refs — Reference tracking. Finds where a symbol is defined, imported, called, re-exported. Across files.

semantiq_deps — Dependency analysis. What does this file import? What imports it?

semantiq_explain — Symbol explanation. Definition, documentation, usage patterns, related symbols.

The landing page

Next.js 16 with App Router and locale-based routing.

Structure

  • Locale pages (app/[locale]/) — Homepage, docs, changelog, features, support
  • MDX docs (content/docs/[locale]/*.mdx) — gray-matter + next-mdx-remote
  • Changelog (content/changelog/*.md) — Frontmatter with version, date, type (feature/improvement/fix/breaking)
  • i18n — English + French via next-intl

Design system

CSS variables in OKLCH for light/dark themes. Custom type classes (.heading-display, .body-lg), component classes (.bento-card, .terminal), animations (.animate-fade-up, .shimmer).

Semantiq documentation page
Integrated docs. Install, configure, go.

Open source

MIT. No "open core" upsell, no paid hosted version. Everything's in the repo.

The project accepts contributions via GitHub. Docs live in the repo. The goal: a tool that belongs to the community, not a product that tolerates community involvement.

Dogfooding

Every feature exists because I hit a friction point in my own workflow. The tool gets production-tested daily because I ship code with it daily.

This project proves something I believe in: dev tools should be fast, honest, and built by people who need them.