universal-lsp
Два проекта в одном репозитории, созданные вместе, потому что один нуждается в другом:
Universal LSP — один быстрый, малопотребляющий память языковой сервер на C++, покрывающий множество языков через объявляемые на Lua плагины. Каждый уровень анализа, включая семантический, работает нативно в одном процессе. Он никогда не запускает, не проксирует и не зависит от rust-analyzer, pyright, clangd или любого другого бинарного или сетевого сервиса. Создан для мира, ориентированного на терминал и агентов: стандартный LSP через stdio для редакторов, MCP-интерфейс для агентов и безголовый batch-query CLI для CI.
graph-lite — недостающий SQLite для графов: небольшая, не имеющая зависимостей, встраиваемая библиотека графов свойств, которую любой проект может подключить через один заголовочный файл. Её публичный интерфейс — это C ABI, поэтому Ruby, JavaScript, Python, Rust, Go и C встраивают её через свой собственный FFI без необходимости поддерживать обёртку — то же самое, что дало SQLite его распространение. LSP — её первый и самый требовательный потребитель — графы вызовов, графы импортов и связи символов в больших кодовых базах при интерактивной задержке — но API graph-lite свободен от этой лексики и механически защищён от её изучения.
Статус: до реализации. Репозиторий, шлюзы, документация и план на месте; текущая работа — фаза 1 сборки (ядро graph-lite). Здесь пока ничего не выпущено. Объём описан в
docs/spec.md; прогресс — в вехах.
Зачем
Сегодня каждый язык приносит свой собственный сервер, свой процесс, свой объём памяти и своё представление о том, сколько стоит «переход к определению». Откройте четыре проекта на четырёх языках — и вы запустите дюжину процессов, которые ничего не разделяют: ни кэша, ни индекса, ни графа связей. И ни один из них не был спроектирован для клиента, который теперь выполняет большую часть чтения и редактирования: ИИ-агента, работающего в терминале, без подключённого редактора, вносящего пакетные изменения прямо на диск.
Universal LSP — это один процесс для всего этого. Добавление языка означает написание декларативных правил на Lua, а не нового сервера.
Related MCP server: code-auditor-mcp
Уровни
Язык получает ровно ту глубину, которую описывают правила его плагина — не больше, не меньше, и никогда не зависит от того, что установлено на машине.
Уровень | Даёт вам | Управляется |
1 — Синтаксис | подсветка, свёртывание, структура, сопоставление скобок | ссылка на грамматику tree-sitter + файлы запросов |
2 — Структура | переход к определению, поиск ссылок, переименование, символы рабочей области | декларативные правила областей/привязок + опциональные чистые Lua-обратные вызовы |
3 — Семантика | подсказки с учётом типов, диагностика типов, семантическое завершение | декларативные правила типов поверх общего нативного ядра унификации |
4 — Связи | графы вызовов, графы импортов, радиус влияния, пути вызовов | результаты уровней 2/3, материализованные в graph-lite |
Уровень 4 — это то, что на самом деле нужно агенту: что вызывает это транзитивно и что сломается, если я изменю это — ответы из предварительно вычисленного графа, а не из сотни чтений файлов.
Архитектура
editor ──stdio LSP──┐
agent ──MCP────────┤
CI ──batch CLI──┘
│
┌──────▼──────┐
│ shim/cli │ thin entrypoints, no logic
└──────┬──────┘
│ unix socket
┌────────▼─────────┐
│ daemon │ one per user, many sessions,
│ engine/ │ warm caches, per-workspace state
└────┬────────┬────┘
tree-sitter │
+ Lua rules │
│ │
┌────▼─────┐ ┌────▼─────┐
│ analysis │──▶ graph-lite│ generic nodes + typed edges
└──────────┘ └──────────┘ (knows nothing about code)Зависимости распространяются только в одном направлении: analysis → graph-lite, никогда обратно. Два линт-стражника и отдельная CI-задача сборки поддерживают это, потому что альтернатива — заметить это при извлечении — означает переписывание.
Быстрый старт
git clone https://github.com/developerz-ai/universal-lsp.git
cd universal-lsp
bin/setup # prerequisites → configure → link compile_commands.json
bin/check # the full gate: format, guards, build, tests, sanitizers
bin/dev doctor # one row per thing that can driftТребуются CMake ≥ 3.24, Ninja, компилятор C++20, clang-format и Bun для инструментов репозитория. bin/setup укажет, чего не хватает и как это установить.
Встраивание graph-lite отдельно
graph-lite собирается без знания об этом репозитории — это проверяется в каждом PR, чтобы последующее извлечение оставалось git mv, а не переписыванием:
cmake -S graph-lite -B build/graph-lite -G Ninja
cmake --build build/graph-lite#include "graph-lite.h" /* the contract: C linkage, opaque handles, status codes */#include "graph-lite.hpp" // C++ ergonomics over the same entry points, header-onlyrequire "ffi" # and the same from Ruby, JS, Python, Rust, Go
module GraphLite
extend FFI::Library
ffi_lib "graph-lite"
attach_function :graph_lite_version_string, [], :string
endЕдиница трансляции на C в тестовом наборе компилируется как C и связывается, поэтому заголовок, переставший быть совместимым с C, ломает нашу сборку, а не вашу интеграцию.
API и модель данных: docs/graph-lite/README.md · почему C: ADR 0004.
Языки при запуске
TypeScript · JavaScript · Ruby · C · C++ · Lua · Python · Java · Kotlin · Swift · Rust
Уровни 1 и 2 появляются первыми во всех одиннадцати — это большая часть ценности и для редакторов, и для агентов. Глубина уровня 3 растёт для каждого языка, деградируя до «неизвестного типа», а не до неверного.
Документация
Читать | Для чего |
полный контракт объёма — цели, не-цели, фазы сборки | |
подводные камни, уже оплаченные чужими ошибками в релизах | |
библиотека, написанная так, как будто она уже существует отдельно | |
кодирование позиций, обработка изменений файловой системы, дизайн демона | |
обучение её новому языку | |
как ведётся работа над этим репозиторием — прочтите перед первым изменением |
Вклад
Прочтите CONTRIBUTING.md, затем CLAUDE.md. Плагины для языков вне официальных одиннадцати не требуют одобрения и не имеют места в этом репозитории — опубликуйте git-репозиторий и закрепите его.
Лицензия
Движок распространяется под Apache-2.0. graph-lite — под MIT и намеренно версионируется независимо: встраивание одного заголовка никогда не должно заставлять думать о лицензии того, что его породило.
This server cannot be deployed
Maintenance
Related MCP Connectors
Code intelligence for coding agents: semantic, AST, graph, and full-text search. 279+ languages.
Hosted code graph over MCP: exact callers, dependencies, and cross-repo blast radius for AI agents.
Persistent memory, knowledge graph, task management and more for AI agents via MCP.
The Cortex MCP server provides read-only access to real-time engineering context from the Cortex developer portal, allowing AI coding assistants to answer natural language questions about your organization's catalog (microservices, libraries, domains, teams, infrastructure), scorecards (engineering standards and best practices), initiatives (goals and deadlines), and Engineering Intelligence metrics. It includes tools for querying documentation, tracking personal entities, and accessing AI-assisted insights across the entire Cortex ecosystem.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables AI clients to perform local code search, indexing, and analysis across Java, JavaScript/TypeScript, .NET/C#, and Python projects through the MCP protocol.1Apache 2.0
- AlicenseAqualityAmaintenanceEnables AI assistants to search, analyze, and understand multi-language codebases by providing indexed code intelligence via MCP.16700 npm8MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI coding agents to query a local, continuously updated symbol graph of a codebase, providing ranked search, caller/callee exploration, dependency paths, and git-diff impact analysis through MCP tools.1 npmApache 2.0
- AlicenseNot gradedqualityBmaintenanceProvides IDE-like coding capabilities for AI agents via MCP, enabling semantic code retrieval, symbol-level editing, refactoring, and navigation across many programming languages.MIT