vhdl-rag-mcp
vhdl-rag-mcp
MCP-сервер (Model Context Protocol), который даёт агентам, пишущим код, высококачественный семантический поиск по VHDL-коду организации, связанной с ним документации и общим исходникам (C/C++, Python, ...) — всё перекрёстно слинковано и с точной атрибуцией источника.
Запускается как uvx vhdl-rag-mcp через stdio. Внешние сервисы не требуются: Qdrant работает во встроенном режиме, а модели эмбеддингов выполняются локально (ONNX через FastEmbed).
Возможности
Три индексируемых домена — один сервер. VHDL-исходники, документация (Markdown/reST/text) и обычный код (C/C++, Python, ...) хранятся в трёх коллекциях Qdrant, и для каждого чанка есть плотный (jina v2) и разрежённый (BM25) вектор.
Гибридный поиск. Каждый запрос использует нативный гибридный поиск Qdrant (dense + sparse, с RRF-объединением): семантическая близость и точное совпадение идентификатора в одном вызове. Спросите про
rst_n— и вы получите результат.Нарезка с учётом структуры VHDL. VHDL-файлы нарезаются по конструкциям (entity, architecture, process, package, function) с помощью языкового сервера vhdl_ls (
documentSymbolс точными диапазонами строк), со структурным построчным сканером как запасным вариантом для файлов с синтаксическими ошибками — и с целым файлом как последним средством, чтобы ни один VHDL не терялся.Нарезка с учётом структуры в остальных случаях. Документация разбивается по секциям заголовков; обычный код — по функциям/классам верхнего уровня с помощью tree-sitter (для любого языка, у которого есть грамматика), с gap-чанками в области видимости файла для непокрытого кода верхнего уровня.
Перекрёстные ссылки. В полезной нагрузке каждого чанка хранятся идентификаторы, которые он определяет или на которые ссылается (
symbols). Поисковые инструменты принимают фильтрsymbols, который отбирает чанки, ссылающиеся на заданные идентификаторы, — соединяя документацию ↔ VHDL ↔ тестовый код (например, можно найти все VHDL-процессы и C-функции, работающие сfifo_write).Ранжирование с учётом приоритета. Репозитории имеют категорию (
golden>approved>project>legacy) или явныйpriority0–100, к которому применяется ограниченный бонус к суммарному скору: эталонные репозитории побеждают при равенстве релевантности, не перебивая истинное сходство.Точная атрибуция источника. Каждый результат указывает репозиторий, файл, диапазон строк и коммит;
get_sourceвозвращает точное текущее содержимое файла (или диапазон строк) из синхронизированного рабочего дерева.Инкрементальный самообновляющийся индекс. Репозитории синхронизируются из Git (clone/fetch/diff); заново нарезаются и эмбеддятся только изменённые файлы. Фоновая задача синхронизирует репозитории каждые
sync_intervalсекунд; инструменты могут в любой момент принудительно запустить синхронизацию или полную переиндексацию.Плавная деградация. Сбои изолированы в рамках репозитория и фиксируются в состоянии; «сломанный» репозиторий не блокирует ни остальные, ни сервер.
stdout протокольно чист. Все логи идут в stderr и ротируемый файл журнала, поэтому сервер безопасно запускать из любого MCP-хоста.
Related MCP server: PAMPA
Установка
Требования:
uv (для
uvx), Python ≥ 3.12Git (с вашими обычными учётными данными/настройками SSH для приватных репозиториев)
бинарь
vhdl_ls(нужен только для репозиториев, содержащих VHDL): установите релиз с https://vhdl-lang.org/, чтобыvhdl_lsбыл вPATH, либо укажитеvhdl_ls_pathна сам бинарь. Каталогvhdl_libraries, поставляемый рядом с бинарём, определяется автоматически.
$ uvx vhdl-rag-mcp --help
# (the server speaks MCP over stdio; --help is not a flag — see "Usage")При первом запуске сервер создаёт свой каталог данных, загружает модели эмбеддингов (jina v2 base-code + base-en, примерно десятки МБ каждая, однократно) и выполняет первичную синхронизацию всех настроенных репозиториев.
Конфигурация
Файл конфигурации: ~/.config/vhdl-rag/config.toml (при отсутствии создаётся при первом запуске с закомментированным шаблоном).
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 subtreeПримечания:
ref: имя ветки считывается и отслеживается при каждой синхронизации. Тег или SHA коммита фиксирует репозиторий (полный 40-hex SHA полностью пропускает сетевой fetch).Домены/исключения репозитория: индекс должен вносить только то, что должен вносить репозиторий — например,
domains = ["vhdl"]для репозитория, где только IP-ядра, аexclude = ["sim"]— чтобы пропускать файлы, предназначенные только для симуляции.Смена моделей эмбеддингов меняет размерность плотного вектора; сервер честно и внятно останавливается вместо того, чтобы портить индекс (удалите коллекцию или
data_dirи переиндексируйте).
Использование
Запуск сервера
$ uvx vhdl-rag-mcpСервер обслуживает MCP через stdio, пока хост не закроет соединение; фоновая задача синхронизирует все репозитории каждые sync_interval секунд. Одиночка, блокировка одного экземпляра (data_dir/server.lock) предотвращает одновременное использование одного каталога данных двумя серверами.
Подключение к MCP-клиенту
Claude Code:
$ claude mcp add vhdl-rag-mcp -- uvx vhdl-rag-mcpMaki (TOML-конфиг — проверьте точные имена таблиц по документации вашей версии Maki):
[mcp_servers.vhdl_rag_mcp]
command = "uvx"
args = ["vhdl-rag-mcp"]Инструменты
Tool | What it does |
| Гибридный поиск по VHDL- исходникам (entity, architecture, process, package, function). |
| То же по разделам документации. |
| То же по модулям обычного кода (функции/классы). |
| Все три домена сразу, с RRF-объединением. |
| Точное текущее содержимое файла (или его фрагмент) с указанием коммита. |
| По репозиторию: категория, ref, домен, последний проиндексированный коммит, последняя синхронизация, последняя ошибка. |
| Инкрементальная синхронизация (по умолчанию — все). Ошибки изолируется в рамках репозитория. |
| Пересоздание индекса одного репозитория. |
Все поисковые инструменты принимают опциональный фильтр repository (имя) и category (gold, approved, project, legacy), а также symbols: list[str] — ограничьте результаты чанками, которые ссылаются на один из перечисленных идентификаторов. Результаты выдаются в виде Markdown с указанием источника, скором и встречающимися идентификаторами; содержимое обёрнуто по домену.
Пример сценария работы агента:
search_knowledge("asynchronous reset conventions")→ раздел документации плюс VHDL-процессы, реализующие сброс.search_vhdl("reset", symbols=["rst_n"])→ каждый VHDL-чанк, в котором упоминаетсяrst_n.get_source("company-standards", "rtl/reset_ctl.vhd", 12, 40)→ точное строки, которые можно взять.
Эксплуатация
Каталог данных (
data_dir): коллекции Qdrant, рабочие trees репозиториев (<name>/), состояние синхронизации (state/repositories.json), файл журнала (logs/vhdl-mcp.log) и файл блокировки. Удаление каталога сбрасывает индекс.Состояние и повторные попытки:
indexed_commitрепозитория продвигается только после полного успеха обновления индекса; при сбое синхронизации остаётся предыдущий коммит, и следующая синхронизация повторяет тот же diff.last_sync_errorвидно черезrepository_status.Удаление репозитория из конфига: при следующем запуске сервер обнаружит его в состоянии и автоматически удалит все его чанки и его состояние.
Журналы:
stderr+logs/vhdl-rag-mcp.log(ротация, 3×5 МБ). Для подробного вывода LSP/git/эмбеддингов —log_level = "DEBUG".
Разработка
$ 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 suiteТестовый набор полностью автономен: локальные git-remotes по file://, скрипт фейкового LSP-сервера, фейковые провайдеры эмбеддингов (один тест с реальным бинарником упирается в переменную VHDL_LS_TEST_BIN).
Структура проекта:
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