vhdl-rag-mcp
vhdl-rag-mcp
Ein MCP-Server (Model Context Protocol), der Coding-Agenten hochwertige semantische Suche über den VHDL-Code einer Organisation, die dazugehörige VHDL-Dokumentation und allgemeinen Quellcode (C/C++, Python, ...) bietet – alles untereinander referenziert, alles mit exakter Quellenangabe.
Der Server läuft als uvx vhdl-rag-mcp über stdio. Keine externen Dienste erforderlich: Qdrant läuft eingebettet und die Embedding-Modelle laufen lokal (ONNX via FastEmbed).
Funktionen
Drei indexierte Domänen, ein Server. VHDL-Quellcode, Dokumentation (Markdown/reST/text) und allgemeiner Code (C/C++, Python, ...) liegen in drei Qdrant-Collections, jeweils mit einem dense- (jina v2) und einem sparse- (BM25) Vektor pro Chunk.
Hybride Suche. Jede Abfrage nutzt Qdrants native Hybrid-Suche (dense + sparse, RRF-fused): semantische Ähnlichkeit und exaktes Identifier-Matching in einem Aufruf. Frag nach
rst_n, und du bekommst es.VHDL-bewusstes Chunking. VHDL-Dateien werden pro Konstrukt (entity, architecture, process, package, function, component) zerlegt, mithilfe des Sprache-Servers vhdl_ls (
documentSymbolmit exakten Zeilenbereichen), mit einem strukturellen Zeilenscanner als Fallback für Dateien mit Syntaxfehlern – und als letzte Option das Ganze Datei, damit nichts verloren geht.Strukturbewusstes Chunking für die übrigen Inhalte. Dokumentation wird pro Überschriftenabschnitt in Chunks aufgeteilt; allgemeiner Code wird mit tree-sitter (jede Sprache mit Grammatik) pro Top-Level-Funktion/Klasse in Chunks aufgeteilt, mit Gap-Chunks auf Dateiebene für nicht abgedeckten Top-Level-Code.
Querverweise. Jeder Chunk-Payload speichert die Identifier, die er definiert oder referenziert (
symbols). Die Suche akzeptiert einensymbols-Filter, der Chunks auswählt, die die angegebenen Identifier referenzieren – verbindet Dokumentation ↔ VHDL ↔ Testcode (z. B. jeden VHDL-Prozess und jede C-Funktion finden, diefifo_writeberühren).Prioritätsbewusstes Ranking. Repositories tragen eine Kategorie (
golden>approved>project>legacyoder einen explizitenpriority0–100), die einen begrenzten Bonus auf den fusionierten Score anwendet: Referenz-Repositories gewinnen bei Relevanz-Gleichstand, ohne die eigentliche Ähnlichkeit zu überdecken.** exakte Quellenangabe.** Jedes Ergebnis nennt Repository, Datei, Zeilenbereich und Commit;
get_sourceliefert den exakten aktuellen Dateiinhalt (oder einen Zeilenbereich) aus dem synchronisierten Arbeitsverzeichnis.Incremental, self-maintaining index. Repositories werden aus Git synchronisiert (clone/fetch/diff): implica . Nur geänderte Dateien werden neu in Chunks aufgeteilt uns neu eingebettett. Ein Hintergrund-Task synchronisiert alle
sync_intervalSekunden; die unbfänger können jederzeit einen Sync oder einen vollständigen Reindex erzwingen.Graceful Degradation. Fehler werden pro Repository gekapselt und im Zustand festgehalten; ein defektes Repository blockiert weder die anderen noch den Server.
Stdout ist protokollsauber. Alle Logging-Ausgaben gehen an
stderrund in eine rotierende Logdatei, so dass with jedem MCP-Host bedenkenlos ausgeführt werden kann.
Related MCP server: PAMPA
Installation
Voraussetzungen:
uv (für
uvx), Python ≥ 3.12Git (mit deinen üblichen Zugangsdaten/SSH-Setup für private Repositories)
Die
vhdl_ls-Binärdatei (nur für Repositories mit VHDL nötig): Installiere ein Release von https://vhdl-lang.org/, sodassvhdl_lsin deinemPATHliegt, oder weisevhdl_ls_pathauf die Binärdatei. Das Verzeichnisvhdl_libraries, das neben der Binärdatei ausgeliefert wird, wird automatisch erkannt.
$ uvx vhdl-rag-mcp --help
# (the server speaks MCP over stdio; --help is not a flag — see "Usage")Beim ersten Start erzeugt der Server sein Datenverzeichnis, lädt die Embedding-Modelle herunter (jina v2 base-code + base-en, jeweils ~Toten von MB, einmalig) und führt eine initiale Synchronisierung aller konfigfierten Repositories durch.
Configuration
Konfigdatei: ~/.config/vhdl-rag/config.toml (wird beim ersten Start, falls nicht vorhanden, mit kommentierter Vorlage erstellt).
data_dir = "~/.local/share/vhdl-rag" # all state lives here
sync_interval = 300 # seconds between periodic syncs
vhdl_ls_path = "vhdl_ls" # binary on PATH or full path
log_level = "INFO"
[embeddings]
vhdl_model = "jinaai/jina-embeddings-v2-base-code" # per-collection dense models
docs_model = "jinaai/jina-embeddings-v2-base-en"
code_model = "jinaai/jina-embeddings-v2-base-code"
sparse_model = "Qdrant/bm25" # one shared sparse model
[qdrant]
mode = "local" # embedded (default) — or "server" with url
# url = "http://qdrant:6333"
[[repositories]]
name = "company-standards" # unique, [A-Za-z0-9._-]
url = "git@github.com:company/vhdl-standards.git"
ref = "main" # branch (tracked on every sync),
# tag, or commit SHA (pinned)
category = "golden" # golden | approved | project | legacy
priority = 100 # optional 0-100 (defaults by category:
# golden=100, approved=90, project=70, legacy=20)
# domains = ["vhdl", "docs", "code"] # which domains to index (default: all)
# exclude = ["sim", "build/*", "*.log"]# glob path excludes ('*' crosses '/');
# wildcard-free patterns exclude the subtreeHinweise:
ref: Ein Branchname wird bei jeder Synchronisierung geholt und verfolgt. Ein Tag oder Commit-SHA fixiert das Repository fest (eine complete vollständige 40-char Hex-SHA überspringt den Netz-Fetch vollständige).Domänen/Ausschlüsse pro Repository: Es wird nur das indexiert, was das Repository zum Index beitragen soll – z. B.
domains = ["vhdl"]für ein reines IP-Repository,exclude = ["sim"], um simulationsspezifische Dateien zu übergehen.Änderung der Embedding-Modelle ändert die Dimension des dense-Vektors; der Server scheitert sonst mit einer klaren und hilfreichen Meldung, statt den Index zu korruptieren (Collection oder
data_dirlöschen und neu indexieren).
Verwendung
Server starten
$ uvx vhdl-rag-mcpEr stellt MCP über stdio bereit, bis der Host die Verbindung schließt; ein Hintergrund-Task synchronisiert alle Repositories alle sync_interval Sekunden. Eine Einzelinstanz-Sperre (data_dir/server.lock) verhindert, dass zwei Server ein gemeinsames Datenverzeichnis nutzen.
Bei einem MCP-Client registrieren
Claude Code:
$ claude mcp add vhdl-rag-mcp -- uvx vhdl-rag-mcpMaki (TOML-Konfiguration – prüfe die genauen Tabellennamen in der Dokumentation deiner Maki-Version):
[mcp_servers.vhdl_rag_mcp]
command = "uvx"
args = ["vhdl-rag-mcp"]Tools
Tool | Funktion |
| Hybride Suche über VHDL-Quellcode (Entities, Architekturen, Prozesse, Packages, Funktionen). |
| Dasselbe für Dokumentationsabschnitte. |
| Dasselbe für allgemeine Code-Einheiten (Funktionen/Klassen). |
| Alle drei Domänen gleichzeitig, RRF-fused. |
| Exakten aktuellen Dateiinhalt (oder einen Ausschnitt) mit Commit-Zurechnung. |
| Pro Repository: Kategorie, ref, Domänen, letzter indexierter Commit, letzter Sync, letzter Fehler. |
| Inkrementelle Synchronisation (Standard: alle). Fehler werden pro Repository begrenzt. |
| Verwurft den Index eines Repositories und baut ihn neu auf. |
Alle Suchwerkzeuge akzeptieren optionale Filter für repository (Name) und category (golden/approved/project/legacy) sowie symbols: list[str] – schränken die Ergebnisse auf Chunks ein, die einen der angegebenen Identifier referenzieren. Ergebnisse werden als Markdown mit Quellenangabe, Score und referenzierten Identifiers ausgegeben; Inhalte sind nach Domäne in Code-Fences abgegrenzt.
Beispiel für einen Agenten-Ablauf:
search_knowledge("asynchronous reset conventions")→ einen Dokumentationsabschnitt und die VHDL-Prozesse, die Resets implementieren.search_vhdl("reset", symbols=["rst_n"])→ jeden VHDL-Chunk, derrst_nberührt.get_source("company-standards", "rtl/reset_ctrl.vhd", 12, 40)→ die exakten Zeilen zum Kopieren.
Betrieb
Datenverzeichnis (
data_dir): Qdrant-Collections, die Git-Arbeitsverzeichnisse je Repository (<name>/), Synchronisationszustand (state/repositories.json), die Logdatei (logs/vhdl-rag-mcp.log) sowiedata_dirund die Sperrdatei. Das Löschen setzt den Index zurück.Zustand & Retry: Der
indexed_commiteines Repos wird nur dann weitergeführt, wenn seine Indexaktualisierung vollständig erfolgreich war; ein fehlgeschlagener Sync behält den vorherigen Commit, und der nächste Sync bearbeitet denselben Diff erneut.last_sync_errorist überrepository_statussichtbar.Entfernen eines Repos aus der Konfiguration: Beim nächsten Start erkennt der Server es in der Zustandsdatei und entfernt restlos alle seine Chunks und den Zustand.
Logs:
stderr+logs/vhdl-rag-mcp.log(rotierend, 3×5 MB).log_level = "DEBUG"für Details zu LSP/Git/Embedding.
Entwicklung
$ uv sync
$ uv run ruff format -q . && uv run ruff check . # format + lint
$ uv run mypy src # strict types
$ uv run pytest -q # offline test suiteDie Testsuite läuft vollständig offline: lokale file://-Git-Remotes, ein simuliertes LSP-Server-Skript sowie simulierte Embedding-Anbieter (ein Test mit echter Binärdatei ist durch die Umgebungsvariable VHDL_LS_TEST_BIN geschützt).
Layout:
src/vhdl_rag_mcp/
config.py typed config (pydantic) + default template
state.py atomic repository sync state
git_manager.py async clone/fetch/checkout + incremental SyncPlan
routing.py extension -> domain classification (+domains/excludes)
lsp/client.py vhdl_ls LSP client (handshake, quiet-wait, symbols)
embeddings/ FastEmbed dense/sparse providers (per-collection + shared)
vector_store.py Qdrant wrapper: hybrid RRF query, payload filters
indexing/ vhdl (LSP-primary), docs (sections), code (tree-sitter),
pipeline (incremental sync driver)
retrieval.py search service: fusion, priority bonus, source access
server.py FastMCP tools + startup + periodic sync + lockMaintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables semantic code search across multiple repositories using natural language queries. Provides intelligent code discovery, symbol lookups, and cross-repo dependency analysis for AI coding agents.MIT
- AlicenseNot gradedqualityCmaintenanceProvides semantic code search and retrieval capabilities for AI agents, enabling them to query codebases using natural language with automatic learning, hybrid search, and intelligent chunking of functions and classes.429ISC
- FlicenseNot gradedqualityBmaintenanceEnables AI agents and IDEs to ingest and search code repositories using hybrid retrieval (dense + sparse) with exact line-level citations for precise code analysis.1
- FlicenseAqualityBmaintenanceGives coding agents a memory of codebases by searching repositories using semantic similarity and structural call/import graphs, enabling reuse of proven patterns and reducing token usage.6
Related MCP Connectors
Code intelligence for coding agents: semantic, AST, graph, and full-text search. 279+ languages.
Token-efficient search for coding agents over public and private documentation.
Page-cited retrieval for embedded docs, datasheets, MISRA, CMSIS, and RTOS references.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/ru551n/vhdl-rag-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server