refactor(mcp)!: BREAKING — все имена MCP-тулов snake_case → camelCase (унификация с in-app агентом) #412

Open
opened 2026-07-07 20:54:16 +03:00 by agent_vscode · 0 comments
Collaborator

Мотивация

Один и тот же логический тул сейчас живёт под двумя именами: внешний MCP — snake_case (edit_page_text), in-app агент — camelCase (editPageText). Это дублирует документацию, путает при переносе промптов/скиллов между поверхностями (см. инцидент #410 — промпт роли и MCP-guide описывают одни и те же тулы разными именами) и мешает шарить спеки (#294).

Решение владельца: единый нейминг — camelCase везде, включая внешний MCP.

Механика (по коду проверено)

Имя MCP-тула определяется в двух местах:

  1. packages/mcp/src/tool-specs.ts — поле mcpName в каждой из 35 спек SHARED_TOOL_SPECS (его читает registerShared @ packages/mcp/src/index.ts:143). Правка: mcpName: 'edit_page_text''editPageText' и т.д. По сути mcpName станет равен ключу спеки — можно заодно дедуплицировать (выводить имя из ключа), но это опционально.
  2. packages/mcp/src/index.ts — inline-регистрации server.registerTool("snake_name", …) для тулов вне общего реестра: search, update_page_json, docmost_transform, stash_page, insert_footnote, insert_image, replace_image, update_comment, delete_comment, table_get и пр. ( — часть уедет в общий реестр по #410/#411, там имена станут camelCase автоматически).

Плюс тексты: MCP guide-инструкция (index.ts:50), контрибьютор-комментарий (index.ts:42), README'шки, CHANGELOG.

Таблица соответствия (migration notes для CHANGELOG)

Было Стало
check_new_comments checkNewComments
copy_page_content copyPageContent
create_comment createComment
create_page createPage
delete_comment deleteComment
delete_node deleteNode
delete_page deletePage
diff_page_versions diffPageVersions
docmost_transform docmostTransform
edit_page_text editPageText
export_page_markdown exportPageMarkdown
get_node getNode
get_outline getOutline
get_page getPage
get_page_json getPageJson
get_workspace getWorkspace
import_page_markdown — (удаляется, #411)
insert_footnote insertFootnote
insert_image insertImage
insert_node insertNode
list_comments listComments
list_page_history listPageHistory
list_pages listPages
list_shares listShares
list_spaces listSpaces
move_page movePage
patch_node patchNode
rename_page renamePage
replace_image replaceImage
resolve_comment resolveComment
restore_page_version restorePageVersion
search search (без изменений)
search_in_page searchInPage
share_page sharePage
stash_page stashPage
table_delete_row tableDeleteRow
table_get tableGet
table_insert_row tableInsertRow
table_update_cell tableUpdateCell
unshare_page unsharePage
update_comment updateComment
update_page_json updatePageJson
— (новый) updatePageMarkdown (#411)

⚠️ Breaking impact

  • Все внешние MCP-клиенты ломаются разом: permission-allowlists (mcp__gitmost-*__get_node → перестанут матчиться), сохранённые промпты/скиллы, .mcp.json-конфиги, cron/headless-сценарии. Мигрировать надо синхронно с деплоем.
  • Метрики: per-tool лейблы (обвязка #402/#403 таймит по имени тула) — ряды переименуются; дашборды/алерты по старым именам обновить.
  • В один релиз с #411 — чтобы внешние конфиги ломались один раз, а не два.

Скоуп

  1. tool-specs.ts: 35 × mcpName → camelCase (или вывод имени из ключа).
  2. index.ts: inline-имена → camelCase; guide-текст (:50) и правило для контрибьюторов (:42) — переписать имена.
  3. Доки: README.md, README.ru.md, packages/mcp/README.md; CHANGELOG — секция BREAKING с таблицей выше.
  4. Тесты: packages/mcp/test/*, контрактные спеки in-app слоя (shared-tool-specs.contract.spec.ts проверяет mcpName).
  5. Серверные упоминания snake-имён в промптах/каталогах (если есть) — грепнуть _page|_node|_comment по agent-roles-catalog и промптам ai-chat.

Критерии приёмки

  • tools/list внешнего MCP не содержит ни одного snake_case имени.
  • Ключ спеки, mcpName и имя in-app тула совпадают для каждого общего тула.
  • CHANGELOG содержит полную таблицу миграции.

Связано: #410, #411 (выпускать одним breaking-релизом).

## Мотивация Один и тот же логический тул сейчас живёт под двумя именами: внешний MCP — snake_case (`edit_page_text`), in-app агент — camelCase (`editPageText`). Это дублирует документацию, путает при переносе промптов/скиллов между поверхностями (см. инцидент #410 — промпт роли и MCP-guide описывают одни и те же тулы разными именами) и мешает шарить спеки (#294). **Решение владельца: единый нейминг — camelCase везде**, включая внешний MCP. ## Механика (по коду проверено) Имя MCP-тула определяется в двух местах: 1. **`packages/mcp/src/tool-specs.ts`** — поле `mcpName` в каждой из **35** спек `SHARED_TOOL_SPECS` (его читает `registerShared` @ `packages/mcp/src/index.ts:143`). Правка: `mcpName: 'edit_page_text'` → `'editPageText'` и т.д. По сути `mcpName` станет равен ключу спеки — можно заодно дедуплицировать (выводить имя из ключа), но это опционально. 2. **`packages/mcp/src/index.ts`** — inline-регистрации `server.registerTool("snake_name", …)` для тулов вне общего реестра: `search`, `update_page_json`*, `docmost_transform`, `stash_page`*, `insert_footnote`*, `insert_image`*, `replace_image`*, `update_comment`, `delete_comment`, `table_get` и пр. (* — часть уедет в общий реестр по #410/#411, там имена станут camelCase автоматически). Плюс тексты: MCP guide-инструкция (`index.ts:50`), контрибьютор-комментарий (`index.ts:42`), README'шки, CHANGELOG. ## Таблица соответствия (migration notes для CHANGELOG) | Было | Стало | |---|---| | `check_new_comments` | `checkNewComments` | | `copy_page_content` | `copyPageContent` | | `create_comment` | `createComment` | | `create_page` | `createPage` | | `delete_comment` | `deleteComment` | | `delete_node` | `deleteNode` | | `delete_page` | `deletePage` | | `diff_page_versions` | `diffPageVersions` | | `docmost_transform` | `docmostTransform` | | `edit_page_text` | `editPageText` | | `export_page_markdown` | `exportPageMarkdown` | | `get_node` | `getNode` | | `get_outline` | `getOutline` | | `get_page` | `getPage` | | `get_page_json` | `getPageJson` | | `get_workspace` | `getWorkspace` | | `import_page_markdown` | — (удаляется, #411) | | `insert_footnote` | `insertFootnote` | | `insert_image` | `insertImage` | | `insert_node` | `insertNode` | | `list_comments` | `listComments` | | `list_page_history` | `listPageHistory` | | `list_pages` | `listPages` | | `list_shares` | `listShares` | | `list_spaces` | `listSpaces` | | `move_page` | `movePage` | | `patch_node` | `patchNode` | | `rename_page` | `renamePage` | | `replace_image` | `replaceImage` | | `resolve_comment` | `resolveComment` | | `restore_page_version` | `restorePageVersion` | | `search` | `search` (без изменений) | | `search_in_page` | `searchInPage` | | `share_page` | `sharePage` | | `stash_page` | `stashPage` | | `table_delete_row` | `tableDeleteRow` | | `table_get` | `tableGet` | | `table_insert_row` | `tableInsertRow` | | `table_update_cell` | `tableUpdateCell` | | `unshare_page` | `unsharePage` | | `update_comment` | `updateComment` | | `update_page_json` | `updatePageJson` | | — (новый) | `updatePageMarkdown` (#411) | ## ⚠️ Breaking impact - **Все внешние MCP-клиенты ломаются разом**: permission-allowlists (`mcp__gitmost-*__get_node` → перестанут матчиться), сохранённые промпты/скиллы, `.mcp.json`-конфиги, cron/headless-сценарии. Мигрировать надо синхронно с деплоем. - Метрики: per-tool лейблы (обвязка #402/#403 таймит по имени тула) — ряды переименуются; дашборды/алерты по старым именам обновить. - В один релиз с #411 — чтобы внешние конфиги ломались один раз, а не два. ## Скоуп 1. `tool-specs.ts`: 35 × `mcpName` → camelCase (или вывод имени из ключа). 2. `index.ts`: inline-имена → camelCase; guide-текст (:50) и правило для контрибьюторов (:42) — переписать имена. 3. Доки: `README.md`, `README.ru.md`, `packages/mcp/README.md`; CHANGELOG — секция BREAKING с таблицей выше. 4. Тесты: `packages/mcp/test/*`, контрактные спеки in-app слоя (`shared-tool-specs.contract.spec.ts` проверяет `mcpName`). 5. Серверные упоминания snake-имён в промптах/каталогах (если есть) — грепнуть `_page|_node|_comment` по `agent-roles-catalog` и промптам ai-chat. ## Критерии приёмки - `tools/list` внешнего MCP не содержит ни одного snake_case имени. - Ключ спеки, `mcpName` и имя in-app тула совпадают для каждого общего тула. - CHANGELOG содержит полную таблицу миграции. Связано: #410, #411 (выпускать одним breaking-релизом).
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: vvzvlad/gitmost#412