用途
本技能面向 Acquia Source 站点,用于通过 Source MCP 在 Drupal CMS 中创建和编辑导航菜单。其核心原则是:菜单属于 CMS(Drupal 菜单实体和菜单链接),这是生产环境中正确且可维护的模型。该技能自动化的是你在 Acquia Source 站点“结构 → 菜单”下会创建的同一份数据,而不是用组件中硬编码的链接列表来替代 CMS。
适用条件
仅在以下条件全部满足时使用:
- 目标是 Acquia Source Drupal 站点(参见 AGENTS.md,例如该环境的 .cms.acquia.site 或 CANVAS_SITE_URL)。
- 你正在为该远程站点编写或更改菜单或菜单链接。
- 你将使用 Source MCP(需阅读每个工具的 schema;服务器 id 通常是 user-source-mcp)。
不适用场景
- 非 Acquia Source / Source MCP 目标(其他托管、仅本地 Workbench,或未针对该环境使用 Source MCP 服务器的 Canvas 站点)。这些情况应使用 Drupal 管理后台或项目常规操作创建菜单,不要通过本文档处理。
- 在应由编辑器驱动的站点上,把代码中的静态 FALLBACK_LINKS 当作真实 Drupal 菜单的替代品。回退链接仅用于空状态或预览;在 Source 上仍应在 CMS(MCP 或 UI)中创建菜单。
- 如果 Source 站点上 Source MCP 不可用,仍应在 Drupal 管理后台(结构 → 菜单)创建相同菜单——那才是正确位置;缺失的只是自动化路径,而不是模型。参见 canvas-navigation-components。
与 Canvas 组件的关系
CMS 优先:作者和本技能操作 Drupal;组件只按机器名读取 menu_items。保持 component.yml 中的 menuName 与你在 CMS 中创建的菜单同步(参见 canvas-data-fetching 和 canvas-navigation-components)。本技能不推送 React 代码,只操作服务器上的菜单实体。当组件源码仍需上传时,使用 canvas-component-push。
发现现有菜单
创建重复项之前,先列出菜单:
- MCP 资源:drupal://menus(JSON 列表;条目可能包含指向各菜单项树的链接——参见你的服务器资源模板)。
- 使用与工具相同的服务器 id(<source-mcp-id>)。
MCP 工具
调用工具前,务必在 MCP 文件系统中阅读 Source 服务器每个工具的 JSON schema。典型的菜单相关工具:
- create_menu:新建自定义菜单,参数包括机器 id、标签、可选描述。
- update_menu:更改现有菜单 id 的标签或描述。
- create_menu_item:添加链接,参数包括 menu_name、title、link、可选 parent、weight、enabled、expanded、description。
- update_menu_item:按菜单链接内容 id(整数)修补,参数包括 title、link、parent、weight、enabled、expanded、description。
- delete_menu_item:按 id 删除;可选 delete_children。
链接 URI(link 字段)
使用工具 schema 中记录的格式(常见如下):
- 内部路径:internal:/path(例如 internal:/about、internal:/node/1)
- 外部链接:https://example.com
- 实体快捷方式:entity:node/1
- 路由:route:<Drupal route name>
确保路径与站点上真实的别名或节点匹配,以便发布后链接可解析。
层级(嵌套项)
- 先创建父项,再创建子项。
- parent 通常是菜单链接插件 id 字符串(例如 menu_link_content:<uuid>)——按 MCP 工具输出,从 create_menu_item 响应或父项的菜单树资源中获取该值。
- weight:值越小通常越靠前;用于同一层级内的排序。
排序与清理
- 使用 update_menu_item 配合 weight(以及 link / title)来重新排序或修正错误,而无需删除。
- 使用 delete_menu_item 删除条目;如果该项有后代,确认 delete_children 行为。
建议工作流
- 获取 drupal://menus → 记录现有的 main、footer 等菜单。
- 如果需要新菜单(新机器名),调用 create_menu → 然后用该 id 作为 menu_name 添加菜单项。
- 否则针对 main / footer 等调用 create_menu_item,使用与已部署 Canvas 页面或节点匹配的链接 URI(路由方面与 acquia-source-canvas-pages 协调)。
- 在 Drupal UI 中或通过 JSON:API 的 menu_items 验证组件 menuName 对应的菜单,如 canvas-data-fetching 所述。
相关技能
- AGENTS.md:Acquia Source 信号、CANVAS_SITE_URL、Canvas 页面与 CLI。
- canvas-navigation-components:menuName、分解、UX/可访问性。
- canvas-data-fetching:menu_items、sortMenu、SWR、回退。
- acquia-source-canvas-pages:菜单应指向的路径和 canvas_page URL。
- acquia-source-site-build:完整流水线 Phase B5(菜单)。
- canvas-component-push:推送导航组件(与菜单实体分开)。