MCP-серверы
MCP-серверы
LevPro Desktop — это хост для ядра AI. Инструменты-капабилити приходят от MCP-серверов из принадлежащего хосту файла mcp.json. Desktop автоматически управляет этим файлом: ручного редактора JSON нет.
Контракт ядра: Интеграции с хостами и MCP ядра.
Пути данных
| Путь | Назначение |
|---|---|
~/.levpro-ai/mcp.json |
Активные MCP-серверы (пишет Desktop) |
~/.levpro-ai/runtime/mcp-server/ |
Скрипты встроенных MCP-серверов рядом с портативным Node |
~/.levpro-ai/mcp-servers/<id>/ |
Манифесты установленных серверов каталога (+ npm/ для npm-устанавливаемых) |
~/.levpro-ai/mcp-catalog.json |
Кэшированный ответ каталога (теперь встроенный каталог) |
~/.levpro-ai/sandboxes/<sessionId>/ |
Код-песочница чатов без проекта |
~/.levpro-ai/config.yaml |
Сгенерированный конфиг ядра (mcp.external_path → mcp.json) |
Все встроенные серверы самодостаточны и поставляются вместе с приложением. Они работают на собственном портативном Node-рантайме приложения и имеют ноль внешних зависимостей: никаких пакетов npx, никаких uv/uvx, никаких загрузок. Во время установки их исходники копируются в ~/.levpro-ai/runtime/ (в собранном приложении они лежат в asar, а обычный Node CLI не умеет читать пути asar).
Единственное исключение — Context7 (ниже): npm-пакет, устанавливаемый один раз при установке; это единственный сервер, которому нужна сеть при первой установке, и офлайн он работает после этого.
Всегда включённые серверы
При каждой генерации конфига и перед каждым чатом Desktop гарантирует включение файлового сервера рабочей папки:
filesystem
{
"command": "<портативный node>",
"args": ["<runtime>/mcp-server/filesystem-server.js", "<workspace>"],
"allowed_tools": [
"read_text_file", "read_media_file", "read_multiple_files",
"write_file", "edit_file", "create_directory",
"list_directory", "list_directory_with_sizes",
"move_file", "search_files", "directory_tree", "get_file_info"
],
"requires_approval": false
}
- Корни: только активная рабочая папка. Домашний каталог пользователя не раскрывается; чтения вне рабочей папки отклоняет сам файловый сервер.
- Реализован как однофайловый stdio MCP-сервер с ограничением корней с учётом symlink/junction (
mcp-server/lib/roots.js), по именам и схемам инструментов совпадает с эталонным@modelcontextprotocol/server-filesystem, чтобы аргументы вызовов модели оставались совместимыми. list_allowed_directoriesопущен черезallowed_tools.
Серверы каталога (автовыбор по задаче)
Каталог — встроенный и офлайн (mcp-server/builtin-catalog.js): серверы — это обычные Node-скрипты в составе приложения — без сетевых запросов, архивов и uv/uvx. Установщик каталога материализует их манифесты и кэш каталога из этого единого источника.
Перед каждым чатом Desktop классифицирует задачу пользователя локальным llama-server и включает только нужные серверы каталога. Классификация кэшируется на 60 секунд на (рабочую папку, задачу); перезапуск ядра троттлится (не чаще раза в 15 секунд, никогда во время активной генерации) и происходит только если включённый набор серверов реально изменился.
Встроенные серверы каталога
code-sandbox
Во встроенном офлайн-каталоге один сервер: code-sandbox. Это рантайм «думай и действуй кодом» — модель пишет код, выполняет его в изолированной песочнице, видит результат/ошибки и итерирует.
- Расположение песочницы зависит от принадлежности чата (вычисляет Desktop, передаёт через
LEVPRO_SANDBOX_DIR): - чаты проекта →
{workspace}/.sandbox/ - чаты без проекта →
~/.levpro-ai/sandboxes/<sessionId>/ - Инструменты:
execute,create_env,install_library,remove_library,lint_errors(env_status— вспомогательный только-чтение). Python-код выполняется в venv песочницы. - Каталог песочницы переиспользуется всё время жизни чата — он не очищается при старте сервера, поэтому уточняющие вопросы продолжают дорабатывать текущую песочницу. Жизненным циклом владеет Desktop:
- удаление проекта удаляет
{workspace}/.sandbox/ - удаление чата без проекта удаляет его песочницу
requires_approval: true(политика каталога): каждое выполнение/установка кода требует явного согласия, если пользователь не выдал серверу разрешение «всегда».
Npm-устанавливаемые серверы каталога
Записи каталога с полем package устанавливаются один раз через npm в ~/.levpro-ai/mcp-servers/<id>/npm (перед этим гарантируется Node). Их localPath указывает на точку входа пакета (dist/index.js); классификатор задач видит их только после фактической установки.
context7
Актуальная документация и примеры кода популярных библиотек (React, Prisma, Express, Django, …). Выбирается автоматически для задач вида «как использовать X» / «покажи API». Реализация: npm-пакет @upstash/context7-mcp (требует встроенный Node ≥ 20.18.1; лаунчер запускает node <node_modules>/@upstash/context7-mcp/dist/index.js).
- Работает без API-ключа по умолчанию (вызовы инструментов идут на
https://context7.com/apiс бесплатным лимитом на пользователя). - Опциональный ключ задаётся в интерфейсе (кнопка-шестерёнка на верхней панели → Context7 API-ключ) и хранится в
~/.levpro-ai/app-settings.json(context7ApiKey). При установке он передаётся серверу черезCONTEXT7_API_KEY; изменение ключа повторно применяетmcp.jsonи перезапускает ядро. - Инструменты:
resolve-library-id,query-docs— оба только-чтение, поэтому сервер работает сrequires_approval: false.
Системные инструкции (использование MCP)
Desktop добавляет в системный промпт assistant'а правила использования MCP. Контент живёт в electron/config-generator.js (MCP_PROMPT_CONTENT) и идемпотентно записывается в ~/.levpro-ai/prompts/mcp.md (ensureMcpPrompt). Он добавляется в prompt_files assistant'а после системного промпта и до instructions.md рабочей папки, чтобы инструкции пользователя были последними. Правила настроены под семейство моделей Gemma 4: короткие императивные строки, точные имена инструментов mcp_<server>_<tool>, таблица «задача→сервер→инструмент» и без повторения JSON-схем, которые вставляет ядро. Агент planner этот файл не получает (политика только-чтения конфликтует с указаниями для code-sandbox).
Политика подтверждения инструментов
- Всегда включённый сервер
filesystemработает сrequires_approval: false, потому что строго ограничен (корни только рабочей папки, allowlistallowed_tools). - Каталогные серверы работают с
requires_approval: true. Если только каталог не пометил инструментreadonly, агент не может выполнить его без явного согласия пользователя. Desktop показывает событие отказа как диалог подтверждения с кнопками «Разрешить один раз» / «Разрешить всегда» (разрешение сохраняется в~/.levpro-ai/app-settings.json). Ручное редактированиеmcp.jsonне требуется.
Интерфейс
Сырьевого редактора mcp.json и кнопки ручной синхронизации каталога нет: каталог синхронизируется автоматически при установке и при запуске. Кнопки верхней панели: язык, тема, логи («Открыть логи»), каталог данных («Папка данных») и шестерёнка для опционального ключа Context7 (~/.levpro-ai/app-settings.json → context7ApiKey).
Требования
- Пакет ядра
local-ai-mcpв venv Desktop. - Node для встроенных MCP-серверов (из PATH или автоматически установленный портативный Node в
~/.levpro-ai/runtime/tools/node); npm-основанные серверы каталога (Context7) также нуждаются в Node при установке — гарантируется автоматически перед синхронизацией каталога. - Для MCP-серверов не требуется доступ к
api.levpro.ru. Серверу Context7 нужна сеть при вызовах его инструментов моделью и, при самой первой установке, для загрузки npm-пакета.
Связанные страницы
- Область чата — корни файловой системы и области песочницы.
- Подтверждение инструментов — политика согласия.
- Ядро AI — контракт MCP ядра и встроенные инструменты.