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: agentmako
Уровни
Язык получает ровно ту глубину, которую описывают правила его плагина — не больше, не меньше, и никогда не зависит от того, что установлено на машине.
Уровень | Даёт вам | Управляется |
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 installed
Maintenance
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 gradedqualityAmaintenanceDeep code indexing for AI agents. Search symbols, navigate call graphs, explore inheritance, track git history — all via MCP.54MIT
- AlicenseBqualityAmaintenanceLocal-first codebase intelligence engine providing AI coding agents with a typed MCP toolset for understanding and navigating code repositories.10051Apache 2.0
- 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.2Apache 2.0
- AlicenseNot gradedqualityAmaintenanceMCP server for local-first code intelligence, providing structural code graph, semantic search, and impact analysis to AI agents.2MIT
Related MCP Connectors
Code intelligence for coding agents: semantic, AST, graph, and full-text search. 279+ languages.
Analytical memory for AI agents: a real Postgres queried in plain English over MCP. One command.
Your memory, everywhere AI goes. Build knowledge once, access it via MCP anywhere.
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/developerz-ai/universal-lsp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server