LabscoMCP early access ↗
GoodbyePlanetMCP SERVER

semcode

Hybrid semantic search across a set of GitHub repositories — dense embeddings fused with BM25, so "where do we publish order events?" and a bare symbol name both work.

by GoodbyePlanet ↗Code Intelligence & Repository IndexingCommunity

LABSCO SUMMARY

Two vectors per symbol, because one query style is never enough.

Dense embeddings find "where do we publish order events"; BM25 over camelCase and snake_case subwords finds PlaceOrderRequest. Running both and fusing them is why neither question fails. Indexing skips files whose git blob SHA is unchanged, and deletes symbols for files that vanished — but that same change detection means a newly added index field needs a forced reindex, which re-embeds everything. One GITHUB_TOKEN reads every repository you index, which the README flags directly.

What it is

An MCP server that indexes code and git history from GitHub repositories you list. It parses symbols with Tree-sitter, stores two vectors per symbol — a dense semantic one and a BM25 sparse one keyed on code identifier tokens — and fuses the results with Reciprocal Rank Fusion so both query styles land.

What you get

  • Hybrid search by query, filterable by language, service and symbol type — search_code
  • A symbol looked up by name, exact or by case-insensitive token match — find_symbol; and code referencing it, with the definition excluded — find_usages
  • The full source of a file, or one symbol inside it, fetched straight from GitHub — get_code_context
  • Git history indexed and searched in natural language, with full commit detail including changed files and diffs — index_history, search_commits, get_commit
  • Indexing triggered for one service or all, incremental by default — reindex; plus list_indexed_services and index_stats
  • Two prompts that walk a client through a write-up — service_overview for one service, system_design_overview for the whole system, with Mermaid diagrams
  • Framework-aware parsing across Go, Java, Python, TypeScript/JavaScript, Rust, C#, C, C++, Ruby, PHP, Kotlin, Scala, Swift, Dart, Bash, SQL and more — Spring stereotypes and HTTP routes, FastAPI/Pydantic, ASP.NET, Rails, Laravel/Symfony, React/SwiftUI/Flutter widgets

Requirements

Python 3.12+, Docker and a GitHub token — a fine-grained PAT with Contents: read on the target repositories is enough, though the README recommends an org-wide GitHub App if repositories self-register. uv sync, copy .env.example to .env and set GITHUB_TOKEN. Repositories go in config.yaml with an optional github_ref, root and exclude, or are registered on the fly through POST /reindex. Start with make docker-up-jina for local keyless Jina embeddings, or set EMBEDDINGS_PROVIDER to voyage, openai or ollama and use make docker-up. Connect with claude mcp add --transport http semcode http://localhost:8090/mcp, or over stdio. Package semcode 1.1.0, MIT licensed.

Setup effort

Run a container — build the image from the repository, then point your client at it