refactor(mcp)!: BREAKING — все имена MCP-тулов snake_case → camelCase (унификация с in-app агентом) #412
Reference in New Issue
Block a user
Delete Branch "%!s()"
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?
Мотивация
Один и тот же логический тул сейчас живёт под двумя именами: внешний MCP — snake_case (
edit_page_text), in-app агент — camelCase (editPageText). Это дублирует документацию, путает при переносе промптов/скиллов между поверхностями (см. инцидент #410 — промпт роли и MCP-guide описывают одни и те же тулы разными именами) и мешает шарить спеки (#294).Решение владельца: единый нейминг — camelCase везде, включая внешний MCP.
Механика (по коду проверено)
Имя MCP-тула определяется в двух местах:
packages/mcp/src/tool-specs.ts— полеmcpNameв каждой из 35 спекSHARED_TOOL_SPECS(его читаетregisterShared@packages/mcp/src/index.ts:143). Правка:mcpName: 'edit_page_text'→'editPageText'и т.д. По сутиmcpNameстанет равен ключу спеки — можно заодно дедуплицировать (выводить имя из ключа), но это опционально.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_commentscheckNewCommentscopy_page_contentcopyPageContentcreate_commentcreateCommentcreate_pagecreatePagedelete_commentdeleteCommentdelete_nodedeleteNodedelete_pagedeletePagediff_page_versionsdiffPageVersionsdocmost_transformdocmostTransformedit_page_texteditPageTextexport_page_markdownexportPageMarkdownget_nodegetNodeget_outlinegetOutlineget_pagegetPageget_page_jsongetPageJsonget_workspacegetWorkspaceimport_page_markdowninsert_footnoteinsertFootnoteinsert_imageinsertImageinsert_nodeinsertNodelist_commentslistCommentslist_page_historylistPageHistorylist_pageslistPageslist_shareslistShareslist_spaceslistSpacesmove_pagemovePagepatch_nodepatchNoderename_pagerenamePagereplace_imagereplaceImageresolve_commentresolveCommentrestore_page_versionrestorePageVersionsearchsearch(без изменений)search_in_pagesearchInPageshare_pagesharePagestash_pagestashPagetable_delete_rowtableDeleteRowtable_gettableGettable_insert_rowtableInsertRowtable_update_celltableUpdateCellunshare_pageunsharePageupdate_commentupdateCommentupdate_page_jsonupdatePageJsonupdatePageMarkdown(#411)⚠️ Breaking impact
mcp__gitmost-*__get_node→ перестанут матчиться), сохранённые промпты/скиллы,.mcp.json-конфиги, cron/headless-сценарии. Мигрировать надо синхронно с деплоем.Скоуп
tool-specs.ts: 35 ×mcpName→ camelCase (или вывод имени из ключа).index.ts: inline-имена → camelCase; guide-текст (:50) и правило для контрибьюторов (:42) — переписать имена.README.md,README.ru.md,packages/mcp/README.md; CHANGELOG — секция BREAKING с таблицей выше.packages/mcp/test/*, контрактные спеки in-app слоя (shared-tool-specs.contract.spec.tsпроверяетmcpName)._page|_node|_commentпоagent-roles-catalogи промптам ai-chat.Критерии приёмки
tools/listвнешнего MCP не содержит ни одного snake_case имени.mcpNameи имя in-app тула совпадают для каждого общего тула.Связано: #410, #411 (выпускать одним breaking-релизом).