Semantiq
Open-source MCP server for semantic code analysis
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.
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
- Indexing — Walk project → filter → Tree-sitter parse → extract symbols → SQLite (FTS5 + embeddings)
- Search — 3 cascading strategies: semantic (sqlite-vec KNN) → symbol (FTS5 MATCH) → text (grep if not enough results)
- 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).
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.