{"id":6303,"plugin_id":"plugin_asdk_app_6a4d5a687f0881918be3cb8b4b93773d","kind":"skill","collection_source":null,"comparison_source":null,"observed_at":"2026-09-30T22:48:05.444Z","digest":"0b696db08f00c7766b087a0638610ab4fbe09f4cfb75fa16de3feb16ab68adfe","against":null,"payload":{"name":"managing-navigation","description":"Use when adding, renaming, moving, or deleting docs pages, groups, tabs, anchors, versions, languages, or products in the navigation tree through the Mintlify Admin MCP, or when restructuring the sidebar.","included_files":[],"skill_md_contents":"---\nname: managing-navigation\ndescription: Use when adding, renaming, moving, or deleting docs pages, groups, tabs, anchors, versions, languages, or products in the navigation tree through the Mintlify Admin MCP, or when restructuring the sidebar.\n---\n\n# Managing Navigation\n\n## Overview\n\nNavigation is a tree of typed nodes edited with dedicated node tools inside a checked-out session — never through `update_config` (which rejects the `navigation` key). Node types: `page`, `group`, `tab`, `anchor`, `version`, `language`, `product`. Parent/child compatibility is enforced (groups cannot contain tabs; pages have no children).\n\n## Explore first\n\n`list_nodes` filters the tree: `parentId: null` = root nodes, `recursive: true` = all descendants (pair with omitted/null `parentId` to dump the whole tree), `type` = single type or array, plus `language`/`version`/`tab` scope filters. Paginates via `cursor`/`nextCursor` (limit max 500). You need real `nodeId`s from here before any mutation.\n\n**Finding a page's nodeId by path**: `list_nodes { type: 'page', recursive: true }` and match each node's `data.href` against the page path (the same path `search` results and `read` use). There is no direct path-lookup parameter.\n\n## Quick reference\n\n| Task | Tool |\n|------|------|\n| New page | `create_node { parentId, data: { type: 'page', path, content } }` (MDX validated) |\n| New group/tab/version/… | `create_node` with that type's name-shaped `data` |\n| Rename group, set page frontmatter, change icon | `update_node { nodeId, data }` — partial merge, `data.type` must match stored type |\n| Reorder or reparent | `move_node { nodeId, parentId?, order? }` — at least one required; `order` is 0-based; `parentId: null` = root |\n| Rename a page's URL path | `move_node` (path/`href` is immutable in `update_node`) |\n| Remove node + subtree | `delete_node { nodeId }` — returns `deletedNodeIds` |\n| Redirect after deletion | `update_config { op: 'add_redirect', redirect: { source, destination, permanent? } }` — point `destination` at the closest surviving replacement page |\n\n## Page frontmatter lives here\n\n`update_node` with `data.type: 'page'` is the correct tool for `title`, `sidebarTitle`, `description`, `icon`, `tag`, `canonical`, `og:*`, `keywords`, `noindex`, `hidden`, `deprecated` — the merged fields serialize back into the MDX `---` block on save. `edit_page` must not touch frontmatter.\n\n## Common mistakes\n\n- Deleting a published page without adding a redirect — breaks inbound links; pair `delete_node` with `add_redirect`.\n- Trying to set `href`/`pageId` via `update_node` — rejected as immutable; use `move_node`.\n- Moving nodes across version/tab/language/product boundaries unintentionally — allowed, but the response flags `crossedBoundary: true`; check it.\n- Guessing `nodeId`s — always fetch them from `list_nodes` first.\n- Forgetting `save` — nav edits stay on the session branch until published.\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}