feat(mcp): add Serena MCP server with Docker-baked config #73
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/mcp/serena-server"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Что сделано
docker/serena_config.yml— конфиг Serena (6excluded_toolsдля*_memory, GUI-окно и web-dashboard выключены), версионируется в репо.Dockerfile—RUN UV_TOOL_BIN_DIR=/usr/local/bin uv tool install -p 3.13 serena-agent(latest, без пина) +COPY docker/serena_config.yml /root/.serena/serena_config.yml(конфиг запечён в образ, bind-mount не нужен)..opencode/opencode.json— MCP-серверserena(local,--context ide --project-from-cwd, timeout 300000);agent.memory-syncer.tools+="serena_*": false.AGENTS.md— секция «Символьная навигация (Serena)» (CRITICAL-стиль:find_referencing_symbolsперед изменением сигнатуры,rename_symbol/safe_delete_symbolвместо sed,get_diagnostics_for_fileпосле правок; строка про--context ide/activate_project)..opencode/agents/reviewer.md— дубль секции + 2 записи в «Known deterministic links» (serena_config.yml ↔ memory-syncer tools-map; секция AGENTS/reviewer ↔ serena MCP)..opencode/skills/configure-opencode/SKILL.md— sync-процедура: правкиDockerfileтребуютdocker compose up -d --build, не толькоrestart.Почему
У агента нет символьной навигации (кто вызывает функцию, безопасный rename/delete, LSP-диагностика) — grep/read дают только текстовые совпадения. Serena (MCP-сервер на LSP, 40+ языков) закрывает это; совместимость с opencode заявлена авторами. Память Serena глушится Serena-side в одном месте (конфликт с opencode-memory недопустим),
--context ideотключает дубли со встроенными инструментами opencode.Watch out
Gate-заключение (сверка со встроенным LSP opencode, https://opencode.ai/docs/lsp/): встроенный LSP opencode даёт только diagnostics как обратную связь агенту (серверы стартуют по расширению файла,
lspпо умолчанию выключен). Символьное ядро Serena (find_referencing_symbols,find_implementations,rename_symbol,safe_delete_symbol,replace_symbol_body,insert_before/after_symbol,get_symbols_overview,get_diagnostics_for_file) встроенным LSP не покрывается — перекрытие только поget_diagnostics_for_file(диагностика). Scope НЕ сужается: Serena остаётся полной, MCP-запись не урезана.--project-from-cwd: если от cwd нет.git/.serena— проект не активируется; в--context ideactivate_project при стартовом проекте отключён (задокументировано в AGENTS.md-секции).docker/serena_config.ymlне попадает под.dockerignore(app_data/,.git,**/node_modules— docker/ не исключён).jqв образе отсутствует — валидность JSON проверенаpython3 -c "json.load(...)".Pending
—
Closes #70
Closes #70
Code Review Summary
Качественный PR: Serena MCP-сервер с Docker-baked конфигом, per-agent запретом serena tools для memory-syncer и согласованными обновлениями документации (AGENTS.md, reviewer.md, configure-opencode skill). Cross-file impact проанализирован автором — Known deterministic links обновлены, JSON валиден, CI green, PR body полный (Что сделано / Почему / Watch out / Pending осмысленны, gate-заключение по встроенному LSP opencode задокументировано).
Positives
COPY docker/serena_config.yml /root/.serena/) — bind-mount не нужен, версионирование в репо.serena_*: falseдля memory-syncer — конфликт с opencode-memory исключён точечно, остальные агенты получают tools.restart(MCP/skills) иup -d --build(Dockerfile) — правки Dockerfile без пересборки были бы не видны.--project-from-cwdбез.git,.dockerignoreне исключаетdocker/.Suggestions (info, not blocking)
uv tool install -p 3.13 serena-agentбез пина версии — пересборка образа может подтянуть новую мажорную версию с изменённым MCP-контрактом. Trade-off осознанный и задокументирован в PR body, но при следующей пересборке стоит рассмотреть пин (serena-agent==<version>), т.к. wildcardserena_*в tools-map устойчив к переименованиям, а вот CLI-флаги (--enable-gui-log-windowи т.д.) — нет.excluded_tools: *_memoryнеточно: вserena_config.ymlперечислены 6 конкретных имён, из которыхlist_memoriesиrename_memoryне матчатся паттерну*_memory. Стоит уточнить формулировку (например, «6 memory-tools»).Closes #70продублирован дважды в конце body — безвредно, но лишняя строка..git/.serena, что добавляет фоновую нагрузку на контейнер. Задумано (секция в AGENTS.md для всех агентов), но при росте числа репо в workspace стоит мониторить потребление памяти.Verdict: APPROVE