> **This page is generated from the live systemHUB MCP schemas.** A hand-written reference drifts, and a client's AI flails when the docs say X and the tool does Y. This reference is regenerated from the schema snapshot on every deploy so it cannot lie. Guides and examples are hand-written; this reference is not.

Documents are addressed by **UUID**. States are integers — see [Document lifecycle](concepts/document-lifecycle) (`0` GREY draft · `1` ORANGE needs-review · `2` RED overdue · `3` GREEN approved · `4` PURPLE archived). Node/item `type`: `1` = FOLDER, `2` = DOCUMENT.

## Discovery & navigation

### `get_folder_tree`

Returns the hierarchical folder and document tree for the Systems section of SystemHub. Each node includes its ID, title, type (1=FOLDER, 2=DOCUMENT), document state, owner full name, ownerId for filtering, optional secondary owner full name, publication status, isMasterTemplate, isRootMasterTemplate, and nested children. Optionally scope the result to a specific subtree by providing a parent folder UUID. Filter by type to get only folders or only documents. Filter by role to see items assigned to a specific role. Use this tool first to understand the organizational structure before navigating to specific documents. Use ownerId for programmatic owner-based filtering. Results include both operational content (company-owned) and master templates (read-only reference content from the master workspace). Each node/item has isMasterTemplate; tree nodes also have isRootMasterTemplate. When the user asks about their own content, filter to isMasterTemplate=false. Do not edit, delete, move, or publish master templates. get_*_details on master template documents returns 404 — content lives in the master workspace only. Templates appear in trees for browsing.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `parent` | string (uuid) | No | UUID of parent folder or "root" to scope the subtree |
| `role` | string (uuid) | No | Filter by role UUID to show only items assigned to that role |
| `type` | integer | No | Filter by type: 1=FOLDER, 2=DOCUMENT |

### `get_policy_tree`

Returns the hierarchical folder and document tree for the Policies section of SystemHub. Each node includes its ID, title, type (1=FOLDER, 2=DOCUMENT), document state, owner full name, ownerId for filtering, optional secondary owner full name, publication status, isMasterTemplate, isRootMasterTemplate, and nested children. Optionally scope the result to a specific subtree by providing a parent folder UUID. Filter by type to get only folders or only documents. Filter by role to see items assigned to a specific role. Use ownerId for programmatic owner-based filtering. Results include both operational content (company-owned) and master templates (read-only reference content from the master workspace). Each node/item has isMasterTemplate; tree nodes also have isRootMasterTemplate. When the user asks about their own content, filter to isMasterTemplate=false. Do not edit, delete, move, or publish master templates. get_*_details on master template documents returns 404 — content lives in the master workspace only. Templates appear in trees for browsing.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `parent` | string (uuid) | No | UUID of parent folder or "root" to scope the subtree |
| `role` | string (uuid) | No | Filter by role UUID to show only items assigned to that role |
| `type` | integer | No | Filter by type: 1=FOLDER, 2=DOCUMENT |

### `get_training_tree`

Returns the hierarchical folder and training document tree for the Training section of SystemHub. Each node includes its ID, title, type (1=FOLDER, 2=DOCUMENT), document state, owner full name, ownerId for filtering, optional secondary owner full name, publication status, isMasterTemplate, isRootMasterTemplate, and nested children. Optionally scope the result to a specific subtree by providing a parent folder UUID. Filter by type to get only folders or only trainings. Filter by role to see items assigned to a specific role. Use this tool first to understand the organizational structure before navigating to specific trainings. Use ownerId for programmatic owner-based filtering. Results include both operational content (company-owned) and master templates (read-only reference content from the master workspace). Each node/item has isMasterTemplate; tree nodes also have isRootMasterTemplate. When the user asks about their own content, filter to isMasterTemplate=false. Do not edit, delete, move, or publish master templates. get_*_details on master template documents returns 404 — content lives in the master workspace only. Templates appear in trees for browsing.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `parent` | string (uuid) | No | UUID of parent folder or "root" to scope the subtree |
| `role` | string (uuid) | No | Filter by role UUID to show only items assigned to that role |
| `type` | integer | No | Filter by type: 1=FOLDER, 2=DOCUMENT |

### `search_by_name`

Searches for system documents and folders by title using case-insensitive partial matching. Returns a paginated list of matching items with their ID, title, type (1=FOLDER, 2=DOCUMENT), document state, discriminator, owner full name, ownerId, optional secondary owner full name, document content, tags, templates (numbered, with title/subject/details), Videos & Media (numbered media links with title and videoLink), attachments (folder/file tree with download URLs), comments (discussion threads with nested replies), and isMasterTemplate. Use the 'page' and 'limit' parameters to control pagination. This is useful for finding specific documents when you don't know their UUID or location in the folder tree. Use ownerId for programmatic owner-based filtering. Results include both operational content (company-owned) and master templates (read-only reference content from the master workspace). Each node/item has isMasterTemplate;

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `limit` | integer | No | Results per page (default 20, max 100) |
| `page` | integer | No | Page number (default 1) |
| `query` | string | Yes | Search string to match against document/folder titles |

### `search_policy`

Searches for policy documents and folders by title using case-insensitive partial matching. Returns a paginated list of matching items with their ID, title, type (1=FOLDER, 2=DOCUMENT), document state, discriminator, owner full name, ownerId, optional secondary owner full name, document content, tags, templates (numbered, with title/subject/details), Videos & Media (numbered media links with title and videoLink), attachments (folder/file tree with download URLs), comments (discussion threads with nested replies), and isMasterTemplate. Use the 'page' and 'limit' parameters to control pagination. Use ownerId for programmatic owner-based filtering. Results include both operational content (company-owned) and master templates (read-only reference content from the master workspace). Each node/item has isMasterTemplate; tree nodes also have isRootMasterTemplate.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `limit` | integer | No | Results per page (default 20, max 100) |
| `page` | integer | No | Page number (default 1) |
| `query` | string | Yes | Search string to match against document/folder titles |

### `search_training`

Searches for training documents and folders by title using case-insensitive partial matching. Returns a paginated list of matching items with their ID, title, type (1=FOLDER, 2=DOCUMENT), document state, discriminator, owner full name, ownerId, optional secondary owner full name, document content, tags, templates (numbered, with title/subject/details), Videos & Media (numbered media links with title and videoLink), attachments (folder/file tree with download URLs), comments (discussion threads with nested replies), learning tracks (numbered curriculum steps for training documents), and isMasterTemplate. Use the 'page' and 'limit' parameters to control pagination. Use ownerId for programmatic owner-based filtering.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `limit` | integer | No | Results per page (default 20, max 100) |
| `page` | integer | No | Page number (default 1) |
| `query` | string | Yes | Search string to match against training document/folder titles |

### `list_documents_by_owner`

Returns a flat, paginated list of SystemHub documents (systems + policies + trainings) filtered by primary owner, secondary owner, and/or role — in one call, without per-document detail requests. Each item includes id, title, type (1=FOLDER, 2=DOCUMENT), state, section (discriminator), folder path (materializedPath), and owner metadata. Use owner or secondaryOwner as a user UUID or full name. Use ownership=either (default) to find documents where someone is primary OR distinct secondary owner — e.g. "list everything owned by [person UUID]". Use roleId to filter by assigned role. Omit section to search all three areas at once. Set fetchAll=true to retrieve every matching document across pages (up to 5000). Use ownerId for programmatic owner-based filtering.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `fetchAll` | boolean | No | When true, automatically fetches all pages (up to 5000 documents) so you get every match in one response. |
| `limit` | integer | No | Results per page (default 100, max 500). Use fetchAll to retrieve every matching document. |
| `owner` | string | No | Primary owner UUID or full name (e.g. "Jane Smith"). Required unless secondaryOwner or roleId is set. |
| `ownership` | enum: `primary` · `secondary` · `either` | No | How to match owner when owner is set: primary (owner_id only), secondary (distinct secondary owner only), either (primary OR distinct secondary). Default: either. |
| `page` | integer | No | Page number (default 1) |
| `roleId` | string (uuid) | No | Role UUID. Returns documents assigned to this role. |
| `secondaryOwner` | string | No | Secondary owner UUID or full name. When set alone, returns documents with this distinct secondary owner. |
| `section` | enum: `system` · `policy` · `training` | No | Limit to one section. Omit to search systems, policies, and trainings together. |
| `type` | integer | No | Item type: 1=FOLDER, 2=DOCUMENT. Default 2 (documents only). |

## Reading documents

### `get_system_details`

Retrieves the full details of a system document by UUID, including its title, document state (0=GREY/draft, 1=ORANGE/needs-review, 2=RED/overdue, 3=GREEN/approved, 4=PURPLE/archived), HTML content, description, internal notes, tags, templates (numbered, with title/subject/details), Videos & Media (numbered media links with title and videoLink), attachments (folder/file tree with download URLs), comments (discussion threads with author, text, and nested replies), owner full name, ownerId, optional secondary owner full name, review date, isMasterTemplate, and publication status. Use this after finding a document via search_by_name or get_folder_tree to read its content. Check isMasterTemplate from tree/search before calling — master template documents return 404 here.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `id` | string (uuid) | Yes | UUID of the system document |

### `get_policy_details`

Retrieves the full details of a policy document by UUID, including its title, document state (0=GREY/draft, 1=ORANGE/needs-review, 2=RED/overdue, 3=GREEN/approved, 4=PURPLE/archived), HTML content, description, internal notes, tags, templates (numbered, with title/subject/details), Videos & Media (numbered media links with title and videoLink), attachments (folder/file tree with download URLs), comments (discussion threads with author, text, and nested replies), owner full name, ownerId, optional secondary owner full name, review date, and isMasterTemplate. Check isMasterTemplate from tree/search before calling — master template documents return 404 here.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `id` | string (uuid) | Yes | UUID of the policy document |

### `get_training_details`

Retrieves the full details of a training document by UUID, including its title, document state (0=GREY/draft, 1=ORANGE/needs-review, 2=RED/overdue, 3=GREEN/approved, 4=PURPLE/archived), HTML content, description, internal notes, tags, templates (numbered, with title/subject/details), Videos & Media (numbered media links with title and videoLink), attachments (folder/file tree with download URLs), comments (discussion threads with author, text, and nested replies), learning tracks (numbered curriculum steps with linked document UUIDs), owner full name, ownerId, optional secondary owner full name, review date, isMasterTemplate, and whether it has learning tracks. Use this after finding a training via search_training or get_training_tree to read its content. Check isMasterTemplate from tree/search before calling — master template documents return 404 here.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `id` | string (uuid) | Yes | UUID of the training document |

## Access, agreement & progress

### `get_document_members_and_roles`

Retrieves assigned members and roles for a system, policy, or training document. Returns roles assigned to the document plus each member's name, email, role title(s), and access type (direct assignment, role-based, or both). Use after finding the document UUID via search_by_name, search_policy, or search_training. Respects the authenticated user's visibility scope. Set fetchAll=true (default) for a complete access audit.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `documentId` | string (uuid) | Yes | UUID of the system, policy, or training document. Find it via search_by_name, search_policy, search_training, or get_*_details. |
| `fetchAll` | boolean | No | When true (default), fetches all assigned roles and members across pages (up to 5000 users) for a complete access audit. |
| `limit` | integer | No | Results per page when not using fetchAll (default 100, max 500) |
| `page` | integer | No | Page number when not using fetchAll (default 1) |
| `search` | string | No | Optional filter — partial match on member first name, last name, or email |
| `topicType` | enum: `system` · `policy` · `training` | Yes | Document section: "system" for procedures, "policy" for compliance documents, "training" for learning modules. |

### `get_document_agreement_status`

Retrieves sign-off / agreement status for a system, policy, or training document. Returns who has signed off (with timestamp) and who is still pending acknowledgement among users assigned to the document. Use after finding the document UUID via search_by_name, search_policy, or search_training. Respects the authenticated user's visibility scope on the item API. Set fetchAll=true (default) for a complete audit list.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `documentId` | string (uuid) | Yes | UUID of the system, policy, or training document. Find it via search_by_name, search_policy, search_training, or get_*_details. |
| `fetchAll` | boolean | No | When true (default), automatically fetches every assigned user across pages (up to 5000) so signed-off and pending lists are complete. |
| `firstName` | string | No | Optional filter — partial match on user first or last name |
| `lastName` | string | No | Optional filter — partial match on user first or last name |
| `limit` | integer | No | Results per page when not using fetchAll (default 100, max 500) |
| `page` | integer | No | Page number when not using fetchAll (default 1) |
| `topicType` | enum: `system` · `policy` · `training` | Yes | Document section: "system" for procedures, "policy" for compliance documents, "training" for learning modules. |

### `get_document_training_progress`

Retrieves learning completion progress for a training document. Returns each assigned user's percentage complete (based on learning track sign-offs), status (complete, in progress, or not started), and last update time. Use after finding the training UUID via search_training or get_training_details. Respects the authenticated user's visibility scope. Set fetchAll=true (default) for a complete audit list.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `documentId` | string (uuid) | Yes | UUID of the training document. Find it via search_training or get_training_details — training progress only applies to training documents. |
| `fetchAll` | boolean | No | When true (default), automatically fetches every assigned user across pages (up to 5000) so progress lists are complete. |
| `firstName` | string | No | Optional filter — partial match on user first or last name |
| `lastName` | string | No | Optional filter — partial match on user first or last name |
| `limit` | integer | No | Results per page when not using fetchAll (default 100, max 500) |
| `page` | integer | No | Page number when not using fetchAll (default 1) |

## Creating content

### `create_system`

Creates a new system document inside an existing folder. Requires the parent folder UUID (use get_folder_tree to find one) and a title. Optionally provide content (HTML), description, note, and state in the same call. Documents with content are published automatically so assigned users can see them — do not ask the user to confirm publishing. Set publish: false only to keep the document as a draft.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `content` | string | No | Document content (HTML) |
| `description` | string | No | Plain-text description |
| `note` | string | No | Internal note |
| `parent` | string (uuid) | Yes | UUID of the parent folder |
| `publish` | boolean | No | When false, skips publishing after creation. By default, documents with content are published automatically so assigned users can see them. |
| `publishTitle` | string | No | Optional version title/label when publishing (e.g. 'v1.0 - Initial release') |
| `state` | integer | No | Document state: 0=GREY, 1=ORANGE, 2=RED, 3=GREEN, 4=PURPLE |
| `title` | string | Yes | Title of the new system document |

### `create_policy`

Creates a new policy document inside an existing folder. Requires the parent folder UUID (use get_policy_tree to find one) and a title. Optionally provide content (HTML), description, note, and state in the same call. Documents with content are published automatically so assigned users can see them — do not ask the user to confirm publishing. Set publish: false only to keep the document as a draft.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `content` | string | No | Document content (HTML) |
| `description` | string | No | Plain-text description |
| `note` | string | No | Internal note |
| `parent` | string (uuid) | Yes | UUID of the parent folder |
| `publish` | boolean | No | When false, skips publishing after creation. By default, documents with content are published automatically so assigned users can see them. |
| `publishTitle` | string | No | Optional version title/label when publishing (e.g. 'v1.0 - Initial release') |
| `state` | integer | No | Document state: 0=GREY, 1=ORANGE, 2=RED, 3=GREEN, 4=PURPLE |
| `title` | string | Yes | Title of the new policy document |

### `create_training`

Creates a new training document inside an existing folder. Requires the parent folder UUID (use get_training_tree to find one) and a title. Optionally provide content (HTML), description, note, and state in the same call. Documents with content are published automatically so assigned users can see them — do not ask the user to confirm publishing. Set publish: false only to keep the document as a draft.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `content` | string | No | Document content (HTML) |
| `description` | string | No | Plain-text description |
| `note` | string | No | Internal note |
| `parent` | string (uuid) | Yes | UUID of the parent folder where the training will be created |
| `publish` | boolean | No | When false, skips publishing after creation. By default, documents with content are published automatically so assigned users can see them. |
| `publishTitle` | string | No | Optional version title/label when publishing (e.g. 'v1.0 - Initial release') |
| `state` | integer | No | Document state: 0=GREY, 1=ORANGE, 2=RED, 3=GREEN, 4=PURPLE |
| `title` | string | Yes | Title of the new training document |

### `create_folder`

Creates a new folder in the Systems section of SystemHub. Folders organize system documents hierarchically. Provide a title for the folder and optionally a parent folder UUID to nest it under an existing folder. Omitting the parent creates a root-level folder. Returns the created folder's ID, title, and type.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `parent` | string (uuid) | No | UUID of parent folder; omit for root level |
| `title` | string | Yes | Folder name |

### `create_policy_folder`

Creates a new folder in the Policies section of SystemHub. Folders organize policy documents hierarchically. Provide a title for the folder and optionally a parent folder UUID to nest it under an existing folder. Omitting the parent creates a root-level folder. Returns the created folder's ID, title, and type.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `parent` | string (uuid) | No | UUID of parent folder; omit for root level |
| `title` | string | Yes | Folder name |

### `create_training_folder`

Creates a new folder in the Training section of SystemHub. Training folders organize training documents hierarchically. Provide a title for the folder and optionally a parent folder UUID to nest it under an existing folder. Omitting the parent creates a root-level folder. Returns the created folder's ID, title, and type.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `parent` | string (uuid) | No | UUID of parent folder; omit for root level |
| `title` | string | Yes | Folder name |

## Editing & publishing

### `edit_system`

Updates an existing system document's fields. Provide the document UUID and any combination of fields to update: title, content (HTML string), description, internal note, state (0=GREY, 1=ORANGE, 2=RED, 3=GREEN, 4=PURPLE), reviewDate, owner (primary owner UUID), or secondaryOwner (secondary owner UUID). Only provided fields are changed; omitted fields remain untouched. Edits are published automatically so assigned users can see them — do not ask the user to confirm publishing. Set publish: false only to save changes as a draft. Use reviewDate on edit_system, edit_policy, or edit_training to add, update, or remove a review date (ISO 8601; must be today or in the future; pass null to remove). Omit reviewDate to leave it unchanged. Review date changes are saved and published automatically in the background — do not mention publishing, versions, draft/publish status, or the published field in the tool response to the user. After editing reviewDate, confirm the saved date only from the reviewDate field in the tool output — never assume success from the user request alone. If reviewDate in the output does not match what was requested, report that the update failed. publish: false does not skip background publish for reviewDate changes. To mark overdue, set state: 2 (RED) separately.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `content` | string | No | New document content (HTML) |
| `description` | string | No | New description |
| `id` | string (uuid) | Yes | UUID of the system document to update |
| `note` | string | No | Internal note |
| `owner` | string (uuid) | No | UUID of the new primary owner |
| `publish` | boolean | No | When false, skips publishing after edits. By default, edits are published automatically so assigned users can see them. Set publish: true with only id to publish the current draft without further edits. |
| `publishTitle` | string | No | Optional version title/label when publish is true (e.g. 'v1.0 - Initial release') |
| `reviewDate` | string (date-time) or null | No | Review date in ISO 8601 format (e.g. "2025-06-15T00:00:00.000Z") to add or update. Must be today or a future date. Pass null to remove the review date. Omit to leave unchanged. |
| `secondaryOwner` | string (uuid) | No | UUID of the new secondary owner |
| `state` | integer | No | Document state: 0=GREY, 1=ORANGE, 2=RED, 3=GREEN, 4=PURPLE |
| `title` | string | No | New title |

### `edit_policy`

Updates an existing policy document's fields. Provide the document UUID and any combination of fields to update: title, content (HTML string), description, internal note, state (0=GREY, 1=ORANGE, 2=RED, 3=GREEN, 4=PURPLE), reviewDate, owner (primary owner UUID), or secondaryOwner (secondary owner UUID). Only provided fields are changed; omitted fields remain untouched. Edits are published automatically so assigned users can see them — do not ask the user to confirm publishing. Set publish: false only to save changes as a draft. Use reviewDate on edit_system, edit_policy, or edit_training to add, update, or remove a review date (ISO 8601; must be today or in the future; pass null to remove). Omit reviewDate to leave it unchanged. Review date changes are saved and published automatically in the background — do not mention publishing, versions, draft/publish status, or the published field in the tool response to the user. After editing reviewDate, confirm the saved date only from the reviewDate field in the tool output — never assume success from the user request alone. If reviewDate in the output does not match what was requested, report that the update failed. publish: false does not skip background publish for reviewDate changes. To mark overdue, set state: 2 (RED) separately.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `content` | string | No | New document content (HTML) |
| `description` | string | No | New description |
| `id` | string (uuid) | Yes | UUID of the policy document to update |
| `note` | string | No | Internal note |
| `owner` | string (uuid) | No | UUID of the new primary owner |
| `publish` | boolean | No | When false, skips publishing after edits. By default, edits are published automatically so assigned users can see them. Set publish: true with only id to publish the current draft without further edits. |
| `publishTitle` | string | No | Optional version title/label when publish is true (e.g. 'v1.0 - Initial release') |
| `reviewDate` | string (date-time) or null | No | Review date in ISO 8601 format (e.g. "2025-06-15T00:00:00.000Z") to add or update. Must be today or a future date. Pass null to remove the review date. Omit to leave unchanged. |
| `secondaryOwner` | string (uuid) | No | UUID of the new secondary owner |
| `state` | integer | No | Document state: 0=GREY, 1=ORANGE, 2=RED, 3=GREEN, 4=PURPLE |
| `title` | string | No | New title |

### `edit_training`

Updates an existing training document's fields. Provide the training UUID and any combination of fields to update: title, content (HTML string), description, internal note, state (0=GREY, 1=ORANGE, 2=RED, 3=GREEN, 4=PURPLE), reviewDate, owner (primary owner UUID), or secondaryOwner (secondary owner UUID). Only provided fields are changed; omitted fields remain untouched. Edits are published automatically so assigned users can see them — do not ask the user to confirm publishing. Set publish: false only to save changes as a draft. Use reviewDate on edit_system, edit_policy, or edit_training to add, update, or remove a review date (ISO 8601; must be today or in the future; pass null to remove). Omit reviewDate to leave it unchanged. Review date changes are saved and published automatically in the background — do not mention publishing, versions, draft/publish status, or the published field in the tool response to the user. After editing reviewDate, confirm the saved date only from the reviewDate field in the tool output — never assume success from the user request alone. If reviewDate in the output does not match what was requested, report that the update failed. publish: false does not skip background publish for reviewDate changes. To mark overdue, set state: 2 (RED) separately.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `content` | string | No | New document content (HTML) |
| `description` | string | No | New description |
| `id` | string (uuid) | Yes | UUID of the training document to update |
| `note` | string | No | Internal note |
| `owner` | string (uuid) | No | UUID of the new primary owner |
| `publish` | boolean | No | When false, skips publishing after edits. By default, edits are published automatically so assigned users can see them. Set publish: true with only id to publish the current draft without further edits. |
| `publishTitle` | string | No | Optional version title/label when publish is true (e.g. 'v1.0 - Initial release') |
| `reviewDate` | string (date-time) or null | No | Review date in ISO 8601 format (e.g. "2025-06-15T00:00:00.000Z") to add or update. Must be today or a future date. Pass null to remove the review date. Omit to leave unchanged. |
| `secondaryOwner` | string (uuid) | No | UUID of the new secondary owner |
| `state` | integer | No | Document state: 0=GREY, 1=ORANGE, 2=RED, 3=GREEN, 4=PURPLE |
| `title` | string | No | New title |

### `publish_system`

Publishes the current state of a system document by creating an immutable version snapshot. This captures the document's content, description, notes, tags, videos, templates, and attachments at this point in time. Assigned users will see the published version. Optionally provide a version title/label (e.g. 'v2.1 - Updated compliance section'). Each publish creates a new version; previous versions are preserved.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `id` | string (uuid) | Yes | UUID of the system document to publish |
| `title` | string | No | Optional version title/label (e.g. 'v2.1 - Updated compliance section') |

### `publish_policy`

Publishes the current state of a policy document by creating an immutable version snapshot. This captures the document's content, description, notes, tags, videos, templates, and attachments at this point in time. Assigned users will see the published version. Optionally provide a version title/label (e.g. 'v2.1 - Updated compliance section'). Each publish creates a new version; previous versions are preserved.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `id` | string (uuid) | Yes | UUID of the policy document to publish |
| `title` | string | No | Optional version title/label (e.g. 'v2.1 - Updated compliance section') |

### `publish_training`

Publishes the current state of a training document by creating an immutable version snapshot. This captures the training's content, description, notes, tags, videos, templates, and attachments at this point in time. Assigned users will see the published version. Optionally provide a version title/label (e.g. 'v2.1 - Updated training content'). Each publish creates a new version; previous versions are preserved.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `id` | string (uuid) | Yes | UUID of the training document to publish |
| `title` | string | No | Optional version title/label (e.g. 'v2.1 - Updated training content') |

## Organising

### `move_system`

Moves a system document into a different folder. Provide the document UUID and the destination folder UUID (use get_folder_tree to locate folders). The document keeps its title and content; only its location in the folder tree changes. Requires move permission on the document.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `id` | string (uuid) | Yes | UUID of the system document to move |
| `parent` | string (uuid) | Yes | UUID of the destination folder (use get_folder_tree to find folder IDs) |

### `move_policy`

Moves a policy document into a different folder. Provide the document UUID and the destination folder UUID (use get_policy_tree to locate folders). The document keeps its title and content; only its location in the folder tree changes. Requires move permission on the document.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `id` | string (uuid) | Yes | UUID of the policy document to move |
| `parent` | string (uuid) | Yes | UUID of the destination folder (use get_policy_tree to find folder IDs) |

### `move_training`

Moves a training document into a different folder. Provide the document UUID and the destination folder UUID (use get_training_tree to locate folders). The document keeps its title and content; only its location in the folder tree changes. Requires move permission on the document.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `id` | string (uuid) | Yes | UUID of the training document to move |
| `parent` | string (uuid) | Yes | UUID of the destination folder (use get_training_tree to find folder IDs) |

### `rename_system_folder`

Renames a folder or sub-folder in the Systems section of SystemHub. Provide the folder UUID (from get_folder_tree) and the new title. Works at any depth in the folder tree. Requires folder rename permission.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `id` | string (uuid) | Yes | UUID of the folder to rename (use get_folder_tree to find folder IDs; works for root folders and sub-folders) |
| `title` | string | Yes | New folder name |

### `rename_policy_folder`

Renames a folder or sub-folder in the Policies section of SystemHub. Provide the folder UUID (from get_policy_tree) and the new title. Works at any depth in the folder tree. Requires folder rename permission.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `id` | string (uuid) | Yes | UUID of the folder to rename (use get_policy_tree to find folder IDs; works for root folders and sub-folders) |
| `title` | string | Yes | New folder name |

### `rename_training_folder`

Renames a folder or sub-folder in the Training section of SystemHub. Provide the folder UUID (from get_training_tree) and the new title. Works at any depth in the folder tree. Requires folder rename permission.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `id` | string (uuid) | Yes | UUID of the folder to rename (use get_training_tree to find folder IDs; works for root folders and sub-folders) |
| `title` | string | Yes | New folder name |

## Templates, media, tags & comments

### `add_document_templates`

Adds one or more document templates to a system, policy, or training document. Provide the document UUID (find it via search_policy, search_by_name, or search_training) and a list of templates. Each template requires title, subject, and details — ask the user for all three fields before calling this tool. Templates with a duplicate title on the same document are skipped. By default, publishes the document after adding templates so they are visible outside edit mode. Set publish to false to save to the draft only.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `documentId` | string (uuid) | Yes | UUID of the document to update. Use search_policy, search_by_name, or search_training to find the document ID first. |
| `publish` | boolean | No | Whether to publish the document after adding templates so they are visible outside edit mode. Defaults to true. Set to false to save to the draft only. Default: `true`. |
| `templates` | array of object | Yes | Templates to add. Each entry requires title, subject, and details. Example: [{ "title": "Welcome Email", "subject": "Your login details", "details": "<p>Hi {{name}}, welcome!</p>" }] |
| `versionTitle` | string | No | Optional version title when publish is true (e.g. 'Updated templates'). Uses a timestamp if omitted. |

### `edit_document_templates`

Updates one or more existing document templates on a system, policy, or training document. Provide the document UUID (find it via search_policy, search_by_name, or search_training) and a list of edits. Each edit uses currentTitle to identify the template (case-insensitive) and at least one of title, subject, or details to change. Only provided fields are updated; omitted fields stay unchanged. Renaming to a title that already exists on the document is skipped. By default, publishes the document after editing so changes are visible outside edit mode. Set publish to false to update the draft only.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `documentId` | string (uuid) | Yes | UUID of the document to update. Use search_policy, search_by_name, or search_training to find the document ID first. |
| `publish` | boolean | No | Whether to publish the document after editing templates so changes are visible outside edit mode. Defaults to true. Set to false to update the draft only. Default: `true`. |
| `templates` | array of object | Yes | Templates to edit. Each entry requires currentTitle to identify the template, plus at least one of title, subject, or details to change. Example: [{ "currentTitle": "Welcome Email", "subject": "Updated subject line" }] |
| `versionTitle` | string | No | Optional version title when publish is true (e.g. 'Updated templates'). Uses a timestamp if omitted. |

### `remove_document_templates`

Removes one or more document templates from a system, policy, or training document by title. Provide the document UUID (find it via search_policy, search_by_name, or search_training) and a list of template titles to remove. Templates are matched by title (case-insensitive). By default, publishes the document after removing templates so changes are visible outside edit mode. Set publish to false to update the draft only. Returns which templates were removed and which titles were not found on the document.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `documentId` | string (uuid) | Yes | UUID of the document to update. Use search_policy, search_by_name, or search_training to find the document ID first. |
| `publish` | boolean | No | Whether to publish the document after removing templates so changes are visible outside edit mode. Defaults to true. Set to false to update the draft only. Default: `true`. |
| `templates` | array of string | Yes | Template titles to remove from the document. Match by title (case-insensitive). Example: ["Welcome Email", "Sign-off Notice"] |
| `versionTitle` | string | No | Optional version title when publish is true (e.g. 'Updated templates'). Uses a timestamp if omitted. |

### `add_document_videos_and_media`

Adds one or more Videos & Media entries (media link URLs — videos, Pickaxe, etc.) to a system, policy, or training document. Provide the document UUID (find it via search_policy, search_by_name, or search_training) and a list of entries. Each entry requires videoLink; title is optional. Entries with a duplicate link on the same document are skipped. By default, publishes the document after adding so changes are visible outside edit mode. Set publish to false to save to the draft only.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `documentId` | string (uuid) | Yes | UUID of the document to update. Use search_policy, search_by_name, or search_training to find the document ID first. |
| `entries` | array of object | Yes | Videos & Media entries to add. Each entry requires videoLink (media URL); title is optional. Example: [{ "videoLink": "https://pickaxe.co/project/abc", "title": "Interactive demo" }, { "videoLink": "https://www.youtube.com/watch?v=abc123" }] |
| `publish` | boolean | No | Whether to publish the document after adding videos so they are visible outside edit mode. Defaults to true. Set to false to save to the draft only. Default: `true`. |
| `versionTitle` | string | No | Optional version title when publish is true (e.g. 'Updated Videos & Media'). Uses a timestamp if omitted. |

### `remove_document_videos_and_media`

Removes one or more Videos & Media entries (media link URLs — videos, Pickaxe, etc.) from a system, policy, or training document. Provide the document UUID and identify entries by id (from videosAndMedia in get_*_details or search_*), title (case-insensitive), and/or videoLink (exact URL). By default, publishes the document after removal so changes are visible outside edit mode. Set publish to false to update the draft only. Returns which entries were removed and which were not found on the document.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `documentId` | string (uuid) | Yes | UUID of the document to update. Use search_policy, search_by_name, or search_training to find the document ID first. |
| `publish` | boolean | No | Whether to publish the document after removing entries so changes are visible outside edit mode. Defaults to true. Set to false to update the draft only. Default: `true`. |
| `titles` | array of string | No | Entry titles to remove (case-insensitive). Use when the entry has a title set. |
| `versionTitle` | string | No | Optional version title when publish is true (e.g. 'Updated Videos & Media'). Uses a timestamp if omitted. |
| `videoIds` | array of string (uuid) | No | Videos & Media entry UUIDs to remove. Use the id from get_*_details or search_* videosAndMedia entries. |
| `videoLinks` | array of string | No | Media link URLs to remove (exact match). Use when title is null or to target a specific link. |

### `add_document_tags`

Adds one or more tags to a system, policy, or training document by title. Provide the document UUID (find it via search_policy, search_by_name, or search_training) and a list of tag titles. Existing tags are matched by title and reused; unknown titles create new tags. Tags cannot be applied to folders. By default, publishes the document after adding tags so they are visible outside edit mode (same as publish_policy/publish_system/publish_training). Set publish to false to save tags to the draft only. Returns which tags were added, which were already present, and the published version when applicable.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `documentId` | string (uuid) | Yes | UUID of the document to tag. Use search_policy, search_by_name, or search_training to find the document ID first. |
| `publish` | boolean | No | Whether to publish the document after adding tags so they are visible outside edit mode. Defaults to true. Set to false to save tags to the draft only. Default: `true`. |
| `tags` | array of string | Yes | Tag titles to add. Existing tags with the same title are reused; new titles create tags automatically. Example: ["Model Context Protocol", "Compliance"] |
| `versionTitle` | string | No | Optional version title when publish is true (e.g. 'Updated tags'). Uses a timestamp if omitted. |

### `remove_document_tags`

Removes one or more tags from a system, policy, or training document by title. Provide the document UUID (find it via search_policy, search_by_name, or search_training) and a list of tag titles to remove. This unlinks tags from the document only; the tag definitions remain available for other documents. By default, publishes the document after removing tags so changes are visible outside edit mode. Set publish to false to update the draft only. Returns which tags were removed and which were not on the document.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `documentId` | string (uuid) | Yes | UUID of the document to update. Use search_policy, search_by_name, or search_training to find the document ID first. |
| `publish` | boolean | No | Whether to publish the document after removing tags so changes are visible outside edit mode. Defaults to true. Set to false to update the draft only. Default: `true`. |
| `tags` | array of string | Yes | Tag titles to remove from the document. Example: ["Model Context Protocol", "Compliance"] |
| `versionTitle` | string | No | Optional version title when publish is true (e.g. 'Updated tags'). Uses a timestamp if omitted. |

### `add_document_attachments`

Uploads file attachments to a system, policy, or training document (max 100MB per file, up to 10 files per call). Supported formats: PDF (.pdf); Microsoft Word (.doc, .docx, .docm); Excel (.xls, .xlsx, .xlsm); PowerPoint (.ppt, .pptx, .pptm); plain text (.txt, .csv, .rtf); Markdown (.md). Max 100MB per file. Images, MP3, and MP4 must be uploaded in the systemHUB app. When the user attaches files in chat (Add files), read each file and pass contentBase64 + fileName — chat attachments are not sent to this tool automatically. Alternatively use fileUrl for a public download URL. Uploads are published automatically.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `documentId` | string (uuid) | Yes | UUID of the document to update. Use search_policy, search_by_name, or search_training to find the document ID first. |
| `files` | array of object | Yes | Files to upload (1–10, max 100MB each). Supported: PDF (.pdf); Microsoft Word (.doc, .docx, .docm); Excel (.xls, .xlsx, .xlsm); PowerPoint (.ppt, .pptx, .pptm); plain text (.txt, .csv, .rtf); Markdown (.md). Max 100MB per file. Images, MP3, and MP4 must be uploaded in the systemHUB app. Each entry needs contentBase64+fileName OR fileUrl. When the user attaches files via chat (Add files), read each attached file and pass its base64 content here. |
| `parentFolderId` | string (uuid) | No | Default attachment folder UUID for all files. Per-file parentFolderId overrides this. Omit to upload to the document root. |
| `publish` | boolean | No | When false, skips publishing after upload. By default, uploads are published automatically so attachments are visible outside edit mode. Do not set publish: false unless saving to draft only. |
| `versionTitle` | string | No | Optional version title when publish is true (e.g. 'Updated attachments'). Uses a timestamp if omitted. |

### `add_document_comment`

Posts a new comment or reply on a system, policy, or training document. Provide the document UUID (find it via search_policy, search_by_name, or search_training) and the comment text. To reply to an existing thread, set parentCommentId to the parent comment UUID (find comment IDs in get_system_details, get_policy_details, or get_training_details). Optionally quote a document excerpt with matching topicType, or @-mention users via mentions. Notifications are sent automatically for new comments, replies, and mentions.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `documentId` | string (uuid) | Yes | UUID of the document to comment on. Use search_policy, search_by_name, or search_training to find the document ID first. |
| `mentions` | array of string (uuid) | No | Optional user UUIDs to @-mention and notify |
| `parentCommentId` | string (uuid) | No | UUID of the parent comment when replying to an existing thread. Omit for a new root comment. Use get_system_details, get_policy_details, or get_training_details to find comment IDs in the comments array. |
| `quote` | string | No | Quoted excerpt from the document when commenting on a selected passage. Requires topicType. |
| `text` | string | Yes | Comment body text |
| `topicType` | enum: `description` · `content` · `note` | No | Source of quoted text: "description" (Overview), "content" (Details), or "note" (Notes). Required when quote is provided. |

## Learning tracks

### `create_training_learning_track`

Adds a learning track entry to a training document. A learning track links a specific base item as a required step in the training curriculum — always link a document (type=2), not a folder, so users can complete it and have their progress counted. Provide the training UUID, the base item UUID to link, and optionally a title and estimated completion time. Sort order is assigned automatically. Call publish_training after adding all entries to make the curriculum visible to assigned users.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `baseItem` | string (uuid) | Yes | UUID of the base item to link as a curriculum step. Must be a document (type=2) — do not use a folder UUID, as users cannot complete a folder and their progress will not advance for that step. |
| `estimatedTime` | string | No | Estimated time to complete (e.g. "15 min", "1 hour") |
| `title` | string | No | Optional title for the learning track entry; defaults to the base item title |
| `trainingId` | string (uuid) | Yes | UUID of the training document to add the learning track to |

### `edit_training_learning_track`

Updates an existing learning track entry's fields. Provide the training UUID, the learning track UUID, and any combination of fields to update: title, estimatedTime, or baseItem (UUID of the linked item). Only provided fields are changed; omitted fields remain untouched.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `baseItem` | string (uuid) | No | UUID of a different base item to link |
| `estimatedTime` | string | No | New estimated completion time (e.g. "15 min", "1 hour") |
| `learningId` | string (uuid) | Yes | UUID of the learning track entry to update |
| `title` | string | No | New title for the learning track entry |
| `trainingId` | string (uuid) | Yes | UUID of the parent training document |

### `remove_training_learning_tracks`

Removes one or more learning track curriculum steps from a training document. Provide the training UUID (find it via search_training or get_training_details) and identify steps by learningTrackIds (from learningTracks), titles (case-insensitive), and/or baseItems (linked document UUIDs). By default, publishes the training after removal so changes are visible outside edit mode. Set publish to false to update the draft only. Returns which steps were removed and which were not found.

| Parameter | Type | Required | Notes |
|---|---|---|---|
| `baseItems` | array of string (uuid) | No | Linked document UUIDs to remove (matches learning track baseItem). |
| `learningTrackIds` | array of string (uuid) | No | Learning track entry UUIDs to remove. Use id from learningTracks in get_training_details or search_training. |
| `publish` | boolean | No | Whether to publish the training after removing steps so changes are visible outside edit mode. Defaults to true. Set to false to update the draft only. Default: `true`. |
| `titles` | array of string | No | Curriculum step titles to remove (case-insensitive). |
| `trainingId` | string (uuid) | Yes | UUID of the training document. Use search_training or get_training_details to find the training ID first. |
| `versionTitle` | string | No | Optional version title when publish is true (e.g. 'Updated learning track'). Uses a timestamp if omitted. |

---

*Generated from the MCP schema snapshot. Refresh: re-dump `data/mcp-schemas.json` from the live connector, then run `python3 scripts/generate_tool_reference.py`. In the production pipeline this runs on every deploy.*
