This is the MCP / AI reference for systemHUB — written for AI agents and developers. If you are a person looking for how-to help, use help.systemhub.com instead.
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.
Because it mirrors the schema faithfully, it also reproduces the schema’s known inaccuracies until they’re fixed upstream. Where this page conflicts with the concepts pages, the concepts pages win — currently one known case: the schema describes
descriptionas “plain-text”, but the field holds rich text (it’s the Overview, same editor rules as the body — see Authoring content). A schema fix is logged.
⚠️ This page was generated from a stored schema snapshot, not a live fetch. The snapshot was last refreshed 0 days ago, so newer tools or changed parameters may be missing. The live pull now requires a human to approve an OAuth consent screen (a deliberate security change), so it can no longer run unattended. Call
tools/liston your own connection if you need the authoritative set, and treat anything here as accurate as of the snapshot rather than as of today.
Documents are addressed by UUID. States are integers — see 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 when depth > 1. Optionally scope the result to a specific subtree by providing a parent folder UUID, or pass parent “root” (same as omitting parent) for the section root. 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. Default depth is 1 (this level only — nested children are omitted) so large libraries do not overflow the client. Paginate top-level nodes with page/limit (default 50). To expand a folder, call again with parent set to that folder UUID and depth 1. parent “root” is accepted and means the section root (same as omitting parent). For a flat paginated folder list, list_documents_by_owner with type: 1 also works. Before authoring, call get_authoring_contract or read https://systemhub.com/llms-full.txt (raw HTML not entity-escaped; H1–H3 only; four marker-* highlights; Trigger, then h3 steps, then Definition of done). 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.
ℹ️ Three known issues (ours, logged, unfixed). The parameters above are current — call bare first, then open one folder at a time with its id and
depth: 1. What the schema does not tell you: therolefilter is ignored and the full result comes back whatever role you pass · a template folder cannot be opened by its own id, because that id is literally"root"(AI & Templatesin Systems and Policies,Coursesin Trainings) and collides withparent: "root"— raisedepthfrom the top level instead (e.g.depth: 3) ·ownercomes back as an id, not the full name the description promises, and there is noownerIdfield.
| Parameter | Type | Required | Notes |
|---|---|---|---|
parent | string (uuid) or string | No | UUID of a parent folder to scope the subtree, or “root” for the section root. Omit parent for the same as “root”. |
type | integer | No | Filter by type: 1=FOLDER, 2=DOCUMENT |
role | string (uuid) | No | Filter by role UUID to show only items assigned to that role |
depth | integer | No | How many levels to return. 1 = this level only (no nested children). Default 1. Max 20. Drill in by calling again with parent set to a folder UUID. |
page | integer | No | Page of top-level nodes (default 1) |
limit | integer | No | Top-level nodes per page (default 50, max 200) |
Returns
| Field | Type | Notes |
|---|---|---|
tree | array of object | Contains: id, title, type, state, parent, ownerId, owner, secondaryOwnerId, secondaryOwner, published, isMasterTemplate, isRootMasterTemplate… |
page | integer | Page that was returned |
limit | integer | Page size used |
total | integer | Total top-level nodes after depth clipping, before pagination |
hasMore | boolean | True when more top-level nodes exist — increase page |
depth | integer | Depth used for this response |
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 when depth > 1. Optionally scope the result to a specific subtree by providing a parent folder UUID, or pass parent “root” (same as omitting parent) for the section root. Filter by type to get only folders or only documents. Filter by role to see items assigned to a specific role. Default depth is 1 (this level only — nested children are omitted) so large libraries do not overflow the client. Paginate top-level nodes with page/limit (default 50). To expand a folder, call again with parent set to that folder UUID and depth 1. parent “root” is accepted and means the section root (same as omitting parent). For a flat paginated folder list, list_documents_by_owner with type: 1 also works. 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.
ℹ️ Three known issues (ours, logged, unfixed). The parameters above are current — call bare first, then open one folder at a time with its id and
depth: 1. What the schema does not tell you: therolefilter is ignored and the full result comes back whatever role you pass · a template folder cannot be opened by its own id, because that id is literally"root"(AI & Templatesin Systems and Policies,Coursesin Trainings) and collides withparent: "root"— raisedepthfrom the top level instead (e.g.depth: 3) ·ownercomes back as an id, not the full name the description promises, and there is noownerIdfield.
| Parameter | Type | Required | Notes |
|---|---|---|---|
parent | string (uuid) or string | No | UUID of a parent folder to scope the subtree, or “root” for the section root. Omit parent for the same as “root”. |
type | integer | No | Filter by type: 1=FOLDER, 2=DOCUMENT |
role | string (uuid) | No | Filter by role UUID to show only items assigned to that role |
depth | integer | No | How many levels to return. 1 = this level only (no nested children). Default 1. Max 20. Drill in by calling again with parent set to a folder UUID. |
page | integer | No | Page of top-level nodes (default 1) |
limit | integer | No | Top-level nodes per page (default 50, max 200) |
Returns
| Field | Type | Notes |
|---|---|---|
tree | array of object | Contains: id, title, type, state, parent, ownerId, owner, secondaryOwnerId, secondaryOwner, published, isMasterTemplate, isRootMasterTemplate… |
page | integer | Page that was returned |
limit | integer | Page size used |
total | integer | Total top-level nodes after depth clipping, before pagination |
hasMore | boolean | True when more top-level nodes exist — increase page |
depth | integer | Depth used for this response |
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 when depth > 1. Optionally scope the result to a specific subtree by providing a parent folder UUID, or pass parent “root” (same as omitting parent) for the section root. 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. Default depth is 1 (this level only — nested children are omitted) so large libraries do not overflow the client. Paginate top-level nodes with page/limit (default 50). To expand a folder, call again with parent set to that folder UUID and depth 1. parent “root” is accepted and means the section root (same as omitting parent). For a flat paginated folder list, list_documents_by_owner with type: 1 also works. 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.
ℹ️ Three known issues (ours, logged, unfixed). The parameters above are current — call bare first, then open one folder at a time with its id and
depth: 1. What the schema does not tell you: therolefilter is ignored and the full result comes back whatever role you pass · a template folder cannot be opened by its own id, because that id is literally"root"(AI & Templatesin Systems and Policies,Coursesin Trainings) and collides withparent: "root"— raisedepthfrom the top level instead (e.g.depth: 3) ·ownercomes back as an id, not the full name the description promises, and there is noownerIdfield.
| Parameter | Type | Required | Notes |
|---|---|---|---|
parent | string (uuid) or string | No | UUID of a parent folder to scope the subtree, or “root” for the section root. Omit parent for the same as “root”. |
type | integer | No | Filter by type: 1=FOLDER, 2=DOCUMENT |
role | string (uuid) | No | Filter by role UUID to show only items assigned to that role |
depth | integer | No | How many levels to return. 1 = this level only (no nested children). Default 1. Max 20. Drill in by calling again with parent set to a folder UUID. |
page | integer | No | Page of top-level nodes (default 1) |
limit | integer | No | Top-level nodes per page (default 50, max 200) |
Returns
| Field | Type | Notes |
|---|---|---|
tree | array of object | Contains: id, title, type, state, parent, ownerId, owner, secondaryOwnerId, secondaryOwner, published, isMasterTemplate, isRootMasterTemplate… |
page | integer | Page that was returned |
limit | integer | Page size used |
total | integer | Total top-level nodes after depth clipping, before pagination |
hasMore | boolean | True when more top-level nodes exist — increase page |
depth | integer | Depth used for this response |
search_by_name
Searches for system documents and folders by title using case-insensitive partial matching. To search document bodies/URLs, use search_content. By default each match returns only id, title, type (1=FOLDER, 2=DOCUMENT), state, and owner. HTML bodies, tags, templates, videos, attachments, comments, and share links are omitted, and those lookups are skipped. Pass fields (for example [“title”,“state”,“isMasterTemplate”]) to add columns. Pass full: true, or fields: [""], for the complete payload. Breaking change: omitting fields used to return the full result; pass full: true to keep that behaviour. Use page and limit to paginate. Useful when you don’t know a document’s UUID or folder. Use ownerId for programmatic owner-based filtering. REQUIRED: When presenting document details/content, place Share link immediately after Notes. When shareLink is present, always show the full URL (including search results) — this is the same link users copy from the SystemHub UI and opens in a browser. Never hide an existing share link. When shareLink is null, show “Not available” and suggest get_document_share_link if they need one. When presenting document.content HTML (including from search results): render the content faithfully — do not paraphrase or invent surrounding sentences. Any hyperlink in the document must be shown only as its anchor text as a clickable link (e.g. markdown anchor text). Do not add prefixes such as “Link:”, “Additional link:”, or similar. Do not describe the link in prose. Do not append the raw URL in parentheses after the label. If the anchor has no label, show the URL itself as plain linked text. isMasterTemplate is omitted from the default listing. Include it in fields, or pass full: true, before calling get__details — master template documents return 404 there. When the user asks about their own content, filter to isMasterTemplate=false. Do not edit, delete, move, or publish master templates.
| Parameter | Type | Required | Notes |
|---|---|---|---|
query | string | Yes | Search string to match against document/folder titles |
page | integer | No | Page number (default 1) |
limit | integer | No | Results per page (default 20, max 100) |
fields | array of enum: id · title · type · state · discriminator · parent · ownerId · owner · secondaryOwnerId · secondaryOwner · createdAt · reviewDate · isMasterTemplate · shareLink · document · content · description · note · tags · templates · videosAndMedia · attachments · comments or string | No | Optional field filter. Each match returns id plus the listed fields (content, description, and note are projected under document). Omit both fields and full for the default lightweight listing: id, title, type, state, and owner. Pass [”*”] for the complete payload (same as full: true). Example: [“title”,“state”,“isMasterTemplate”]. Skips videos, attachments, comments, and share-link lookups when those fields are not requested. |
full | boolean | No | Set true to return the full search payload (HTML body, tags, templates, media, attachments, comments, share link, and isMasterTemplate). When true, fields is ignored. Omit for the default lightweight listing: id, title, type, state, and owner. Replaces the old behaviour where omitting fields returned the full result. |
Returns
| Field | Type | Notes |
|---|---|---|
items | array of object | Contains: id, title, type, state, discriminator, parent, ownerId, owner, secondaryOwnerId, secondaryOwner, createdAt, reviewDate… |
search_policy
Searches for policy documents and folders by title using case-insensitive partial matching. To search document bodies/URLs, use search_content. By default each match returns only id, title, type (1=FOLDER, 2=DOCUMENT), state, and owner. HTML bodies, tags, templates, videos, attachments, comments, and share links are omitted, and those lookups are skipped. Pass fields (for example [“title”,“state”,“isMasterTemplate”]) to add columns. Pass full: true, or fields: [""], for the complete payload. Breaking change: omitting fields used to return the full result; pass full: true to keep that behaviour. Use page and limit to paginate. Use ownerId for programmatic owner-based filtering. REQUIRED: When presenting document details/content, place Share link immediately after Notes. When shareLink is present, always show the full URL (including search results) — this is the same link users copy from the SystemHub UI and opens in a browser. Never hide an existing share link. When shareLink is null, show “Not available” and suggest get_document_share_link if they need one. When presenting document.content HTML (including from search results): render the content faithfully — do not paraphrase or invent surrounding sentences. Any hyperlink in the document must be shown only as its anchor text as a clickable link (e.g. markdown anchor text). Do not add prefixes such as “Link:”, “Additional link:”, or similar. Do not describe the link in prose. Do not append the raw URL in parentheses after the label. If the anchor has no label, show the URL itself as plain linked text. isMasterTemplate is omitted from the default listing. Include it in fields, or pass full: true, before calling get__details — master template documents return 404 there. When the user asks about their own content, filter to isMasterTemplate=false. Do not edit, delete, move, or publish master templates.
| Parameter | Type | Required | Notes |
|---|---|---|---|
query | string | Yes | Search string to match against document/folder titles |
page | integer | No | Page number (default 1) |
limit | integer | No | Results per page (default 20, max 100) |
fields | array of enum: id · title · type · state · discriminator · parent · ownerId · owner · secondaryOwnerId · secondaryOwner · createdAt · reviewDate · isMasterTemplate · shareLink · document · content · description · note · tags · templates · videosAndMedia · attachments · comments or string | No | Optional field filter. Each match returns id plus the listed fields (content, description, and note are projected under document). Omit both fields and full for the default lightweight listing: id, title, type, state, and owner. Pass [”*”] for the complete payload (same as full: true). Example: [“title”,“state”,“isMasterTemplate”]. Skips videos, attachments, comments, and share-link lookups when those fields are not requested. |
full | boolean | No | Set true to return the full search payload (HTML body, tags, templates, media, attachments, comments, share link, and isMasterTemplate). When true, fields is ignored. Omit for the default lightweight listing: id, title, type, state, and owner. Replaces the old behaviour where omitting fields returned the full result. |
Returns
| Field | Type | Notes |
|---|---|---|
items | array of object | Contains: id, title, type, state, discriminator, parent, ownerId, owner, secondaryOwnerId, secondaryOwner, createdAt, reviewDate… |
search_training
Searches for training documents and folders by title using case-insensitive partial matching. To search document bodies/URLs, use search_content. By default each match returns only id, title, type (1=FOLDER, 2=DOCUMENT), state, and owner. HTML bodies, tags, templates, videos, attachments, comments, and share links are omitted, and those lookups are skipped. Pass fields (for example [“title”,“state”,“isMasterTemplate”]) to add columns. Pass full: true, or fields: [”*”], for the complete payload. Breaking change: omitting fields used to return the full result; pass full: true to keep that behaviour. Learning tracks are omitted unless requested in fields or full: true. Use page and limit to paginate. Use ownerId for programmatic owner-based filtering. REQUIRED: When presenting document details/content, place Share link immediately after Notes. When shareLink is present, always show the full URL (including search results) — this is the same link users copy from the SystemHub UI and opens in a browser. Never hide an existing share link. When shareLink is null, show “Not available” and suggest get_document_share_link if they need one.
| Parameter | Type | Required | Notes |
|---|---|---|---|
query | string | Yes | Search string to match against training document/folder titles |
page | integer | No | Page number (default 1) |
limit | integer | No | Results per page (default 20, max 100) |
fields | array of enum: id · title · type · state · discriminator · parent · ownerId · owner · secondaryOwnerId · secondaryOwner · createdAt · reviewDate · isMasterTemplate · shareLink · document · content · description · note · tags · templates · videosAndMedia · attachments · comments · isLearningTrack · hasLearningTracks · learningTracks or string | No | Optional field filter. Each match returns id plus the listed fields (content, description, and note are projected under document). Omit both fields and full for the default lightweight listing: id, title, type, state, and owner. Pass [”*”] for the complete payload (same as full: true). Example: [“title”,“state”,“isMasterTemplate”]. Skips videos, attachments, comments, and share-link lookups when those fields are not requested. |
full | boolean | No | Set true to return the full search payload (HTML body, tags, templates, media, attachments, comments, share link, and isMasterTemplate). When true, fields is ignored. Omit for the default lightweight listing: id, title, type, state, and owner. Replaces the old behaviour where omitting fields returned the full result. |
Returns
| Field | Type | Notes |
|---|---|---|
items | array of object | Contains: id, title, type, state, discriminator, parent, ownerId, owner, secondaryOwnerId, secondaryOwner, createdAt, reviewDate… |
search_content
Searches document bodies for a literal substring — overview/details/notes, including URLs and phrases. Use this for body/URL/phrase audits. Use search_by_name / search_policy / search_training for titles. Results are snippets only; call get_system_details / get_policy_details / get_training_details only for documents you will edit. Pair with edit_system_content, edit_policy_content, or edit_training_content for surgical find/replace.
| Parameter | Type | Required | Notes |
|---|---|---|---|
query | string | Yes | Literal substring in overview/details/notes (URLs, phrases). Not a title search. |
section | enum: system · policy · training | No | Limit to one section. Omit to search systems, policies, and trainings together. |
folder | string (uuid) | No | Limit to this folder subtree from get_folder_tree |
page | integer | No | Page number (default 1) |
limit | integer | No | Results per page (default 20, max 100) |
Returns
| Field | Type | Notes |
|---|---|---|
items | array of object | Contains: id, title, discriminator, matchedField, snippet |
page | integer | |
limit | integer | |
hasMore | boolean | True when more pages are available — increase page or limit. |
list_documents_by_owner
Returns a flat, paginated list of SystemHub documents (systems + policies + trainings) — 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. Omit owner, secondaryOwner, and roleId to list every item the caller can see (use type: 1 for a company-wide folder list). filterApplied is false in that case. Use owner or secondaryOwner as a user UUID or full name to narrow results. Use ownership=either (default) to find documents where someone is primary OR distinct secondary owner. 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 |
|---|---|---|---|
owner | string | No | Primary owner UUID or full name (e.g. “Jane Smith”). Omit together with secondaryOwner and roleId to list every item the caller can see. |
secondaryOwner | string | No | Secondary owner UUID or full name. When set alone, returns documents with this distinct secondary owner. |
roleId | string (uuid) | No | Role UUID. Returns documents assigned to this role. |
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. |
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). |
page | integer | No | Page number (default 1) |
limit | integer | No | Results per page (default 100, max 500). Use fetchAll to retrieve every matching document. |
fetchAll | boolean | No | When true, automatically fetches all pages (up to 5000 documents) so you get every match in one response. |
Returns
| Field | Type | Notes |
|---|---|---|
items | array of object | Contains: id, title, type, state, discriminator, materializedPath, parent, ownerId, owner, secondaryOwnerId, secondaryOwner |
page | integer | |
limit | integer | |
total | integer | Total matching items across all pages, when the API provides it |
hasMore | boolean | True when more pages are available — increase page or set fetchAll. |
filterApplied | boolean | True when owner, secondaryOwner, or roleId narrowed the results. False when listing every item the caller can see. |
Reading documents
get_system_details
Retrieves details of a system document by UUID. By default returns the full payload (title, state, HTML content, description, notes, tags, templates, Videos & Media, attachments, comments, owners, review date, last modified, published version, isMasterTemplate, shareLink). Pass fields (e.g. [“title”,“description”,“note”]) to return only those properties and skip expensive side fetches — use this for audits/overviews so you do not download full HTML bodies. Check isMasterTemplate from tree/search before calling — master template documents return 404 here. CRITICAL: If shareLink is a non-null URL, you MUST display it in a Share link section whenever you present document details or content — never omit an existing share link.
| Parameter | Type | Required | Notes |
|---|---|---|---|
id | string (uuid) | Yes | UUID of the system document |
fields | array of enum: id · title · type · state · discriminator · parent · ownerId · owner · secondaryOwnerId · secondaryOwner · createdAt · updatedAt · published · versionId · versionTitle · versionCreatedAt · reviewDate · isMasterTemplate · shareLink · document · content · description · note · tags · templates · videosAndMedia · attachments · comments | No | Optional field filter to reduce token usage. When set, only id plus the listed fields are returned (content/description/note are projected under document). Omit for the full document payload. Example: [“title”,“description”,“note”] to audit Overviews without downloading HTML content. Skips videos/attachments/comments/shareLink/version HTTP calls when those fields are not requested. |
Returns
| Field | Type | Notes |
|---|---|---|
id | string (uuid) | Unique identifier of the system document |
title | string | Display name of the system document |
type | number | Item type: 1=FOLDER, 2=DOCUMENT |
state | number | Document state: 0=GREY/draft, 1=ORANGE/needs-review, 2=RED/overdue, 3=GREEN/approved, 4=PURPLE/archived |
discriminator | string | Item category: System, Policy, or Training |
parent | string (uuid) or null | UUID of the parent folder, or null for root items |
ownerId | string (uuid) or null | UUID of the primary owner — use for owner-based filtering |
owner | string or null | Full name of the primary owner |
secondaryOwnerId | string (uuid) | UUID of the secondary owner — omitted when not set |
secondaryOwner | string | Full name of the secondary owner — omitted when not set |
createdAt | string | ISO timestamp of when the document was created |
updatedAt | string | ISO timestamp of when the live document was last modified |
published | boolean | Whether the document has at least one published version snapshot |
versionId | string (uuid) or null | UUID of the latest published version snapshot, or null when never published |
versionTitle | string or null | Title/label of the latest published version, or null when never published |
versionCreatedAt | string or null | ISO timestamp when the latest version was published, or null when never published |
reviewDate | string or null | ISO timestamp of the next scheduled review, or null if not set |
isMasterTemplate | boolean | True if this item is a read-only master template from the master workspace, not company-owned operational content. When the user asks about their own content, filter to isMasterTemplate=false. |
shareLink | string (uri) or null | Public share URL matching the SystemHub UI (e.g. https://{company}.systemhub.com/systems/{id}/{shareCode}). Always surface this to the user when non-null. Null when no share code exists, the item is a folder, or the user lacks SHARE permission. |
document | object or null | Document content details, or null for folders |
tags | array of object | Tags associated with this system document Contains: id, title, createdAt |
templates | array of object | Numbered document templates (title, subject, details) attached to this system document Contains: number, title, subject, details |
videosAndMedia | array of object | Videos & Media — numbered media links (title, videoLink) on this system document Contains: number, id, title, videoLink |
attachments | array of object | Attachments — tree of folders and files on this document. Files include downloadUrl for downloading the attached file. Contains: id, title, type, downloadUrl, children |
comments | array of object | Comments — discussion threads on this system document, each with nested replies Contains: id, createdAt, author, text, quote, topicType, replies |
get_policy_details
Retrieves details of a policy document by UUID. By default returns the full payload (title, state, HTML content, description, notes, tags, templates, Videos & Media, attachments, comments, owners, review date, last modified, published version, isMasterTemplate, shareLink). Pass fields (e.g. [“title”,“description”,“note”]) to return only those properties and skip expensive side fetches — use this for audits/overviews so you do not download full HTML bodies. Check isMasterTemplate from tree/search before calling — master template documents return 404 here. CRITICAL: If shareLink is a non-null URL, you MUST display it in a Share link section whenever you present document details or content — never omit an existing share link.
| Parameter | Type | Required | Notes |
|---|---|---|---|
id | string (uuid) | Yes | UUID of the policy document |
fields | array of enum: id · title · type · state · discriminator · parent · ownerId · owner · secondaryOwnerId · secondaryOwner · createdAt · updatedAt · published · versionId · versionTitle · versionCreatedAt · reviewDate · isMasterTemplate · shareLink · document · content · description · note · tags · templates · videosAndMedia · attachments · comments | No | Optional field filter to reduce token usage. When set, only id plus the listed fields are returned (content/description/note are projected under document). Omit for the full document payload. Example: [“title”,“description”,“note”] to audit Overviews without downloading HTML content. Skips videos/attachments/comments/shareLink/version HTTP calls when those fields are not requested. |
Returns
| Field | Type | Notes |
|---|---|---|
id | string (uuid) | Unique identifier of the policy document |
title | string | Display name of the policy document |
type | number | Item type: 1=FOLDER, 2=DOCUMENT |
state | number | Document state: 0=GREY/draft, 1=ORANGE/needs-review, 2=RED/overdue, 3=GREEN/approved, 4=PURPLE/archived |
discriminator | string | Item category: System, Policy, or Training |
parent | string (uuid) or null | UUID of the parent folder, or null for root items |
ownerId | string (uuid) or null | UUID of the primary owner — use for owner-based filtering |
owner | string or null | Full name of the primary owner |
secondaryOwnerId | string (uuid) | UUID of the secondary owner — omitted when not set |
secondaryOwner | string | Full name of the secondary owner — omitted when not set |
createdAt | string | ISO timestamp of when the document was created |
updatedAt | string | ISO timestamp of when the live document was last modified |
published | boolean | Whether the document has at least one published version snapshot |
versionId | string (uuid) or null | UUID of the latest published version snapshot, or null when never published |
versionTitle | string or null | Title/label of the latest published version, or null when never published |
versionCreatedAt | string or null | ISO timestamp when the latest version was published, or null when never published |
reviewDate | string or null | ISO timestamp of the next scheduled review, or null if not set |
isMasterTemplate | boolean | True if this item is a read-only master template from the master workspace, not company-owned operational content. When the user asks about their own content, filter to isMasterTemplate=false. |
shareLink | string (uri) or null | Public share URL matching the SystemHub UI (e.g. https://{company}.systemhub.com/systems/{id}/{shareCode}). Always surface this to the user when non-null. Null when no share code exists, the item is a folder, or the user lacks SHARE permission. |
document | object or null | Document content details, or null for folders |
tags | array of object | Tags associated with this policy document Contains: id, title, createdAt |
templates | array of object | Numbered document templates (title, subject, details) attached to this policy document Contains: number, title, subject, details |
videosAndMedia | array of object | Videos & Media — numbered media links (title, videoLink) on this policy document Contains: number, id, title, videoLink |
attachments | array of object | Attachments — tree of folders and files on this document. Files include downloadUrl for downloading the attached file. Contains: id, title, type, downloadUrl, children |
comments | array of object | Comments — discussion threads on this policy document, each with nested replies Contains: id, createdAt, author, text, quote, topicType, replies |
get_training_details
Retrieves details of a training document by UUID. By default returns the full payload (title, state, HTML content, description, notes, tags, templates, Videos & Media, attachments, comments, learning tracks, owners, review date, last modified, published version, isMasterTemplate, shareLink). Pass fields (e.g. [“title”,“description”,“note”]) to return only those properties and skip expensive side fetches — use this for audits/overviews so you do not download full HTML bodies. Check isMasterTemplate from tree/search before calling — master template documents return 404 here. CRITICAL: If shareLink is a non-null URL, you MUST display it in a Share link section whenever you present document details or content — never omit an existing share link.
| Parameter | Type | Required | Notes |
|---|---|---|---|
id | string (uuid) | Yes | UUID of the training document |
fields | array of enum: id · title · type · state · discriminator · parent · ownerId · owner · secondaryOwnerId · secondaryOwner · createdAt · updatedAt · published · versionId · versionTitle · versionCreatedAt · reviewDate · isMasterTemplate · shareLink · document · content · description · note · tags · templates · videosAndMedia · attachments · comments · isLearningTrack · hasLearningTracks · learningTracks | No | Optional field filter to reduce token usage. When set, only id plus the listed fields are returned (content/description/note are projected under document). Omit for the full document payload. Example: [“title”,“description”,“note”] to audit Overviews without downloading HTML content. Skips videos/attachments/comments/shareLink/learningTracks/version HTTP calls when those fields are not requested. |
Returns
| Field | Type | Notes |
|---|---|---|
id | string (uuid) | Unique identifier of the training document |
title | string | Display name of the training document |
type | number | Item type: 1=FOLDER, 2=DOCUMENT |
state | number | Document state: 0=GREY/draft, 1=ORANGE/needs-review, 2=RED/overdue, 3=GREEN/approved, 4=PURPLE/archived |
discriminator | string | Item category: System, Policy, or Training |
parent | string (uuid) or null | UUID of the parent folder, or null for root items |
ownerId | string (uuid) or null | UUID of the primary owner — use for owner-based filtering |
owner | string or null | Full name of the primary owner |
secondaryOwnerId | string (uuid) | UUID of the secondary owner — omitted when not set |
secondaryOwner | string | Full name of the secondary owner — omitted when not set |
createdAt | string | ISO timestamp of when the training was created |
updatedAt | string | ISO timestamp of when the live training was last modified |
published | boolean | Whether the training has at least one published version snapshot |
versionId | string (uuid) or null | UUID of the latest published version snapshot, or null when never published |
versionTitle | string or null | Title/label of the latest published version, or null when never published |
versionCreatedAt | string or null | ISO timestamp when the latest version was published, or null when never published |
reviewDate | string or null | ISO timestamp of the next scheduled review, or null if not set |
isLearningTrack | boolean | Whether this training document has learning track curriculum steps |
hasLearningTracks | boolean | Whether this training document has at least one learning track step |
isMasterTemplate | boolean | True if this item is a read-only master template from the master workspace, not company-owned operational content. When the user asks about their own content, filter to isMasterTemplate=false. |
shareLink | string (uri) or null | Public share URL matching the SystemHub UI (e.g. https://{company}.systemhub.com/systems/{id}/{shareCode}). Always surface this to the user when non-null. Null when no share code exists, the item is a folder, or the user lacks SHARE permission. |
document | object or null | Document content details, or null for folders |
tags | array of object | Tags associated with this training document Contains: id, title, createdAt |
templates | array of object | Numbered document templates (title, subject, details) attached to this training document Contains: number, title, subject, details |
videosAndMedia | array of object | Videos & Media — numbered media links (title, videoLink) on this training document Contains: number, id, title, videoLink |
attachments | array of object | Attachments — tree of folders and files on this document. Files include downloadUrl for downloading the attached file. Contains: id, title, type, downloadUrl, children |
comments | array of object | Comments — discussion threads on this training document, each with nested replies Contains: id, createdAt, author, text, quote, topicType, replies |
learningTracks | array of object | Learning track curriculum steps for this training document, ordered by sortOrder Contains: number, id, baseItem, title, estimatedTime, discriminator, sortOrder, createdAt |
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. |
topicType | enum: system · policy · training | Yes | Document section: “system” for procedures, “policy” for compliance documents, “training” for learning modules. |
search | string | No | Optional filter — partial match on member first name, last name, or email |
page | integer | No | Page number when not using fetchAll (default 1) |
limit | integer | No | Results per page when not using fetchAll (default 100, max 500) |
fetchAll | boolean | No | When true (default), fetches all assigned roles and members across pages (up to 5000 users) for a complete access audit. |
Returns
| Field | Type | Notes |
|---|---|---|
documentId | string (uuid) | UUID of the document queried |
topicType | enum: system · policy · training | Document section that was queried |
summary | object | Contains: assignedRoleCount, directMemberCount, roleMemberCount, totalUniqueMembers |
assignedRoles | array of object | Roles currently assigned to this document Contains: roleId, roleTitle, description, membersAmount |
members | array of object | All members with access, deduplicated by user Contains: userId, userName, firstName, lastName, email, userRole, accessType, roles |
get_document_agreement_status
Retrieves sign-off / agreement status for a system, policy, or training document. Returns who is currently signed off, who agreed against an earlier published body, and who is still pending among users assigned to the document. A sign-off is stale when a later published version changed the document body. 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. |
topicType | enum: system · policy · training | Yes | Document section: “system” for procedures, “policy” for compliance documents, “training” for learning modules. |
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 |
page | integer | No | Page number when not using fetchAll (default 1) |
limit | integer | No | Results per page when not using fetchAll (default 100, max 500) |
fetchAll | boolean | No | When true (default), automatically fetches every assigned user across pages (up to 5000) so signed-off and pending lists are complete. |
Returns
| Field | Type | Notes |
|---|---|---|
documentId | string (uuid) | UUID of the document queried |
topicType | enum: system · policy · training | Document section that was queried |
summary | object | High-level compliance counts Contains: totalAssigned, signedOffCount, staleCount, pendingCount |
signedOffUsers | array of object | Users whose sign-off is still current for the latest published body Contains: userId, firstName, lastName, email, fullName, signedOffAt, agreementLogId |
staleUsers | array of object | Users who agreed against an earlier published body. Do not count these as currently agreed Contains: userId, firstName, lastName, email, fullName, signedOffAt, agreementLogId, agreedAgainstEarlierVersion |
pendingUsers | array of object | Users assigned to the document who have not yet signed off Contains: userId, firstName, lastName, email, fullName |
hasMore | boolean | True when pagination was used and more pages may exist — increase page or set fetchAll=true |
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. |
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 |
page | integer | No | Page number when not using fetchAll (default 1) |
limit | integer | No | Results per page when not using fetchAll (default 100, max 500) |
fetchAll | boolean | No | When true (default), automatically fetches every assigned user across pages (up to 5000) so progress lists are complete. |
Returns
| Field | Type | Notes |
|---|---|---|
documentId | string (uuid) | UUID of the training document queried |
summary | object | High-level completion counts Contains: totalAssigned, completeCount, inProgressCount, notStartedCount |
users | array of object | All assigned users with progress percentage and status Contains: userId, firstName, lastName, email, fullName, percentage, status, updatedAt |
completeUsers | array of any | Users who completed the training (100%) |
inProgressUsers | array of any | Users who started but have not completed the training |
notStartedUsers | array of any | Users with no recorded training progress |
hasMore | boolean | True when pagination was used and more pages may exist — increase page or set fetchAll=true |
get_document_activity_log
Retrieves the activity / audit trail for a system, policy, or training document. Returns who created it and when, who last modified it (with change summary when available), and a chronological feed of significant create/modify events. Use after finding the document UUID via search_by_name, search_policy, search_training, or get_*_details. Answers questions like “Who created this system?” and “Who last edited this policy?”. Respects the authenticated user’s view permissions on the item API. Set fetchAll=true (default) for a complete history. Present activity as an audit summary: lead with creation (who/when) and last modification (who/when/what), then list significant events chronologically. Prefer full names and emails. When agentCall is true, say the change was made via MCP. Skip routine view events unless the user explicitly asks for views.
⚠️ Two limits the schema does not mention. Events recorded before the 19 Oct 2026 release are unlabelled, so the absence of
agentCall: trueon an older event proves nothing · writes made with a company API key are not flagged yet and still look like app edits, so readagentCall: falseas “not through MCP”, never as “a human did this”.
| 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. |
topicType | enum: system · policy · training | Yes | Document section: “system” for procedures, “policy” for compliance documents, “training” for learning modules. |
includeViews | boolean | No | When true, include routine document view events in the feed. Default false — only create and modify events are returned. |
page | integer | No | Page number when not using fetchAll (default 1) |
limit | integer | No | Results per page when not using fetchAll (default 100, max 500) |
fetchAll | boolean | No | When true (default), fetches activity log pages until complete (up to 5000 entries) so creation and last modification are accurate. |
Returns
| Field | Type | Notes |
|---|---|---|
documentId | string (uuid) | UUID of the document queried |
topicType | enum: system · policy · training | Document section that was queried |
creation | object or null | Earliest create event, or null if none found |
lastModification | any or null | Most recent modify event, or null if the document was never modified after creation |
events | array of any | Chronological feed of significant activity events (create/modify by default) |
summary | object | Activity counts derived from the fetched logs Contains: totalEvents, createCount, modifyCount, viewCount |
hasMore | boolean | True when pagination was used and more pages may exist — increase page or set fetchAll=true |
Sharing, members & roles
get_document_share_link
Retrieves the public share URL for a system, policy, or training document. Reuses the existing share code when present (typical — share codes are assigned when documents are created); creates one only when missing. Requires SHARE permission for the document type. Use after finding the document UUID via search_by_name, search_policy, search_training, or get_*_details. Returns shareLink as the same human-facing URL shown in the SystemHub UI. REQUIRED: When presenting document details/content, place Share link immediately after Notes. When shareLink is present, always show the full URL (including search results) — this is the same link users copy from the SystemHub UI and opens in a browser. Never hide an existing share link. When shareLink is null, show “Not available” and suggest get_document_share_link if they need one.
| 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. |
topicType | enum: system · policy · training | Yes | Document section: “system” for procedures, “policy” for compliance documents, “training” for learning modules. |
Returns
| Field | Type | Notes |
|---|---|---|
documentId | string (uuid) | UUID of the document the share link belongs to |
topicType | enum: system · policy · training | Document section that was used |
shareCode | string | Share token stored on the document |
shareLink | string (uri) | Public share URL matching the SystemHub UI. Opens the shared document in a browser. |
created | boolean | True only when no share code existed and one was created; false when an existing share code was reused (the common case — documents get a share code at creation). |
manage_document_members
Adds, removes, or updates assigned members and roles on a system, policy, or training document. Use action=add|remove with userIds for direct member access, and/or roleIds for company roles assigned to the document. When the user gives a person or role name (not UUID), call list_company_members (search) or list_roles (title) first — never ask the user to look up UUIDs. Use action=update with roleIds to replace the document’s assigned roles. Requires document UPDATE (or role-assignment) permission. Verify results afterward with get_document_members_and_roles.
| 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. |
topicType | enum: system · policy · training | Yes | Document section: “system” for procedures, “policy” for compliance documents, “training” for learning modules. |
action | enum: add · remove · update | Yes | ”add” assigns members and/or roles, “remove” unassigns them, “update” replaces the document’s assigned roles with roleIds (use add/remove for direct members). |
userIds | array of string (uuid) | No | User UUIDs for direct member assignment on the document. Resolve names via list_company_members (e.g. search=“Ariel Tester”) first — do not ask the user for UUIDs. Required for member add/remove. Omit when only managing roles. |
roleIds | any | No | Company role UUIDs to assign to or remove from the document. Resolve names via list_roles (e.g. title=“Tech Team”) first — do not ask the user for UUIDs. Required for role add/remove/update. Omit when only managing direct members. |
Returns
| Field | Type | Notes |
|---|---|---|
documentId | string (uuid) | UUID of the document that was updated |
topicType | enum: system · policy · training | Document section that was updated |
action | enum: add · remove · update | Action that was performed |
members | array of object | Per-user outcomes for direct member changes Contains: userId, status |
roles | array of object | Per-role outcomes for document role assignment changes Contains: roleId, status |
summary | object | Contains: membersAdded, membersRemoved, membersSkipped, rolesAdded, rolesRemoved, rolesSkipped |
list_company_members
Lists company members and resolves people by name or email to UUIDs. Use when the user names someone (e.g. “Ariel Tester”) before manage_document_members, which requires userIds. Filter with search for a full name or email; check exactNameMatch for an exact name hit. Returns userId, fullName, email, userType, and position.
| Parameter | Type | Required | Notes |
|---|---|---|---|
search | string | No | Resolve a person by full name or email (e.g. “Ariel Tester” or “ariel@example.com”). Splits names into first/last for lookup. Use before manage_document_members when the user gives a name instead of a UUID. |
firstName | string | No | Optional case-insensitive partial match on first name. Ignored when search is provided. |
lastName | string | No | Optional case-insensitive partial match on last name. Ignored when search is provided. |
email | string | No | Optional case-insensitive partial match on email. Ignored when search is provided. |
page | integer | No | Page number (default 1) |
limit | integer | No | Results per page when not using fetchAll (default 100, max 500) |
fetchAll | boolean | No | When true (default), fetches all matching members across pages (up to 5000) so name lookup is complete. |
Returns
| Field | Type | Notes |
|---|---|---|
members | array of object | Matching company members Contains: userId, fullName, firstName, lastName, email, userType, status, position |
page | integer | Page that was returned (1 when fetchAll) |
limit | integer | Page size used for the request |
hasMore | boolean | True when more pages exist and fetchAll was false |
exactNameMatch | any or null | Member whose full name exactly matches the search string (case-insensitive), or null |
list_roles
Lists company roles and resolves role names to UUIDs. Use when the user names a role (e.g. “Tech Team”) before manage_document_members, which requires roleIds. Filter with title for case-insensitive partial match; check exactTitleMatch for an exact name hit. Returns roleId, title, description, and membersAmount.
| Parameter | Type | Required | Notes |
|---|---|---|---|
title | string | No | Optional case-insensitive partial match on role title (e.g. “Tech Team”). Omit to list roles without a title filter. |
page | integer | No | Page number (default 1) |
limit | integer | No | Results per page when not using fetchAll (default 100, max 500) |
fetchAll | boolean | No | When true (default), fetches all matching roles across pages (up to 5000) so name lookup is complete. |
Returns
| Field | Type | Notes |
|---|---|---|
roles | array of object | Matching company roles Contains: roleId, title, description, membersAmount |
page | integer | Page that was returned (1 when fetchAll) |
limit | integer | Page size used for the request |
hasMore | boolean | True when more pages exist and fetchAll was false |
exactTitleMatch | any or null | Role whose title exactly matches the title filter (case-insensitive), or null |
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. The document is always published right after creation so it is visible outside edit mode — do not ask the user to confirm publishing.
| Parameter | Type | Required | Notes |
|---|---|---|---|
parent | string (uuid) | Yes | UUID of the parent folder |
title | string | Yes | Title of the new system document |
content | string | No | Document content as raw HTML (e.g. Title). Pass real tags, not entity-escaped markup (<h2>). Fully entity-escaped content is auto-corrected; content mixing escaped markup with real tags is rejected with an error asking you to resend raw HTML. |
description | string | No | HTML overview (not plain text). Accepts, stores, and renders HTML using the same editor rules as the document body. |
note | string | No | Supporting note as raw HTML (e.g. Note ). Renders on the published document and public share links — do NOT put private context here. Pass real tags, not entity-escaped markup (<p>). Fully entity-escaped notes are auto-corrected; notes mixing escaped markup with real tags are rejected with an error asking you to resend raw HTML. |
state | integer | No | Document state: 0=GREY, 1=ORANGE, 2=RED, 3=GREEN, 4=PURPLE |
publishTitle | string | No | Optional version title/label when publishing (e.g. ‘v1.0 - Initial release’) |
Returns
| Field | Type | Notes |
|---|---|---|
id | string (uuid) | Unique identifier of the created system document |
title | string | Title of the created document |
type | number | Item type: 2=DOCUMENT |
state | number | Document state (0=GREY/draft for newly created) |
parent | string (uuid) or null | UUID of the parent folder |
published | boolean | Whether a version snapshot was published |
versionId | string (uuid) | UUID of the published version when published=true |
versionTitle | string | Title of the published version when published=true |
versionCreatedAt | string | ISO timestamp of version creation when published=true |
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. The document is always published right after creation so it is visible outside edit mode — do not ask the user to confirm publishing.
| Parameter | Type | Required | Notes |
|---|---|---|---|
parent | string (uuid) | Yes | UUID of the parent folder |
title | string | Yes | Title of the new policy document |
content | string | No | Document content as raw HTML (e.g. Title). Pass real tags, not entity-escaped markup (<h2>). Fully entity-escaped content is auto-corrected; content mixing escaped markup with real tags is rejected with an error asking you to resend raw HTML. |
description | string | No | HTML overview (not plain text). Accepts, stores, and renders HTML using the same editor rules as the document body. |
note | string | No | Supporting note as raw HTML (e.g. Note ). Renders on the published document and public share links — do NOT put private context here. Pass real tags, not entity-escaped markup (<p>). Fully entity-escaped notes are auto-corrected; notes mixing escaped markup with real tags are rejected with an error asking you to resend raw HTML. |
state | integer | No | Document state: 0=GREY, 1=ORANGE, 2=RED, 3=GREEN, 4=PURPLE |
publishTitle | string | No | Optional version title/label when publishing (e.g. ‘v1.0 - Initial release’) |
Returns
| Field | Type | Notes |
|---|---|---|
id | string (uuid) | Unique identifier of the created policy document |
title | string | Title of the created document |
type | number | Item type: 2=DOCUMENT |
state | number | Document state (0=GREY/draft for newly created) |
parent | string (uuid) or null | UUID of the parent folder |
published | boolean | Whether a version snapshot was published |
versionId | string (uuid) | UUID of the published version when published=true |
versionTitle | string | Title of the published version when published=true |
versionCreatedAt | string | ISO timestamp of version creation when published=true |
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. The document is always published right after creation so it is visible outside edit mode — do not ask the user to confirm publishing.
| Parameter | Type | Required | Notes |
|---|---|---|---|
parent | string (uuid) | Yes | UUID of the parent folder where the training will be created |
title | string | Yes | Title of the new training document |
content | string | No | Document content as raw HTML (e.g. Title). Pass real tags, not entity-escaped markup (<h2>). Fully entity-escaped content is auto-corrected; content mixing escaped markup with real tags is rejected with an error asking you to resend raw HTML. |
description | string | No | HTML overview (not plain text). Accepts, stores, and renders HTML using the same editor rules as the document body. |
note | string | No | Supporting note as raw HTML (e.g. Note ). Renders on the published document and public share links — do NOT put private context here. Pass real tags, not entity-escaped markup (<p>). Fully entity-escaped notes are auto-corrected; notes mixing escaped markup with real tags are rejected with an error asking you to resend raw HTML. |
state | integer | No | Document state: 0=GREY, 1=ORANGE, 2=RED, 3=GREEN, 4=PURPLE |
publishTitle | string | No | Optional version title/label when publishing (e.g. ‘v1.0 - Initial release’) |
Returns
| Field | Type | Notes |
|---|---|---|
id | string (uuid) | Unique identifier of the created training document |
title | string | Title of the created training document |
type | number | Item type: 2=DOCUMENT |
state | number | Document state (0=GREY/draft for newly created) |
parent | string (uuid) or null | UUID of the parent folder |
published | boolean | Whether a version snapshot was published |
versionId | string (uuid) | UUID of the published version when published=true |
versionTitle | string | Title of the published version when published=true |
versionCreatedAt | string | ISO timestamp of version creation when published=true |
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 |
|---|---|---|---|
title | string | Yes | Folder name |
parent | string (uuid) | No | UUID of parent folder; omit for root level |
Returns
| Field | Type | Notes |
|---|---|---|
id | string (uuid) | Unique identifier of the created folder |
title | string | Name of the created folder |
type | number | Item type: 1=FOLDER |
parent | string (uuid) or null | UUID of the parent folder, or null for root level |
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 |
|---|---|---|---|
title | string | Yes | Folder name |
parent | string (uuid) | No | UUID of parent folder; omit for root level |
Returns
| Field | Type | Notes |
|---|---|---|
id | string (uuid) | Unique identifier of the created folder |
title | string | Name of the created folder |
type | number | Item type: 1=FOLDER |
parent | string (uuid) or null | UUID of the parent folder, or null for root level |
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 |
|---|---|---|---|
title | string | Yes | Folder name |
parent | string (uuid) | No | UUID of parent folder; omit for root level |
Returns
| Field | Type | Notes |
|---|---|---|
id | string (uuid) | Unique identifier of the created folder |
title | string | Name of the created folder |
type | number | Item type: 1=FOLDER |
parent | string (uuid) or null | UUID of the parent folder, or null for root level |
Editing & publishing
get_authoring_contract
Returns the systemHUB document formatting contract as structured data: allowed HTML (H1–H3 only, four marker-* highlights), field mapping (title/overview/details/notes), house structure (Trigger, h3 steps, Definition of done), and known issues. Call this before create_system / create_policy / create_training or any content edit. Does not require a web fetch. Full corpus: https://systemhub.com/llms-full.txt.
No parameters.
Returns
| Field | Type | Notes |
|---|---|---|
docsUrl | string (uri) | Human docs hub |
corpusUrl | string (uri) | Full AI-facing corpus to read before authoring |
sendRawHtml | string | Rule: send raw HTML, never entity-escaped markup |
editorFilter | string | Why unsupported formatting silently changes later |
fields | array of object | The four document content fields and what they map to Contains: name, label, purpose |
allowedHtml | object | Formatting that survives a human save in the editor Contains: headings, headingNote, inline, highlights, highlightNote, lists, blocks, tables, links, images |
houseStructure | array of string | SYSTEMology house format: Trigger, h3 steps, Definition of done |
knownIssues | array of string | Failure modes agents hit when they skip this contract |
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, note, state (0=GREY, 1=ORANGE, 2=RED, 3=GREEN, 4=PURPLE), reviewDate, owner (primary owner UUID), or secondaryOwner (secondary owner UUID, or null to remove). Only provided fields are changed; omitted fields remain untouched. For small text/link fixes inside HTML content, prefer edit_system_content (find/replace) instead of resupplying the full content string. Edits are always published automatically so assigned users can see them — do not ask the user to confirm publishing. 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. To mark overdue, set state: 2 (RED) separately.
| Parameter | Type | Required | Notes |
|---|---|---|---|
id | string (uuid) | Yes | UUID of the system document to update |
title | string | No | New title |
content | string | No | New document content as raw HTML (e.g. Title). Pass real tags, not entity-escaped markup (<h2>). Fully entity-escaped content is auto-corrected; content mixing escaped markup with real tags is rejected with an error asking you to resend raw HTML. |
description | string | No | New HTML overview (not plain text). Accepts, stores, and renders HTML using the same editor rules as the document body. |
note | string | No | Supporting note as raw HTML (e.g. Note ). Renders on the published document and public share links — do NOT put private context here. Pass real tags, not entity-escaped markup (<p>). Fully entity-escaped notes are auto-corrected; notes mixing escaped markup with real tags are rejected with an error asking you to resend raw HTML. |
state | integer | No | Document state: 0=GREY, 1=ORANGE, 2=RED, 3=GREEN, 4=PURPLE |
reviewDate | string (date-time) or null | No | Review date in ISO 8601 format (e.g. “2030-01-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. |
owner | string (uuid) | No | UUID of the new primary owner |
secondaryOwner | string (uuid) or null | No | UUID of the new secondary owner, or null to remove (resets to primary owner) |
publishTitle | string | No | Optional version title/label for the published version (e.g. ‘v1.0 - Initial release’) |
Returns
| Field | Type | Notes |
|---|---|---|
id | string (uuid) | Unique identifier of the updated document |
title | string | Current title after update |
type | number | Item type: 1=FOLDER, 2=DOCUMENT |
state | number | Document state: 0=GREY, 1=ORANGE, 2=RED, 3=GREEN, 4=PURPLE |
reviewDate | string or null | ISO timestamp of the next scheduled review, or null if not set |
published | boolean | Background publish status (for agent verification only). Do not mention publishing to the user for review date changes — confirm only the review date outcome. |
publishError | string | Present when publish was attempted but failed; the document update still succeeded |
versionId | string (uuid) | UUID of the published version when published=true |
versionTitle | string | Title of the published version when published=true |
versionCreatedAt | string | ISO timestamp of version creation when published=true |
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, note, state (0=GREY, 1=ORANGE, 2=RED, 3=GREEN, 4=PURPLE), reviewDate, owner (primary owner UUID), or secondaryOwner (secondary owner UUID, or null to remove). Only provided fields are changed; omitted fields remain untouched. For small text/link fixes inside HTML content, prefer edit_policy_content (find/replace) instead of resupplying the full content string. Edits are always published automatically so assigned users can see them — do not ask the user to confirm publishing. 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. To mark overdue, set state: 2 (RED) separately.
| Parameter | Type | Required | Notes |
|---|---|---|---|
id | string (uuid) | Yes | UUID of the policy document to update |
title | string | No | New title |
content | string | No | New document content as raw HTML (e.g. Title). Pass real tags, not entity-escaped markup (<h2>). Fully entity-escaped content is auto-corrected; content mixing escaped markup with real tags is rejected with an error asking you to resend raw HTML. |
description | string | No | New HTML overview (not plain text). Accepts, stores, and renders HTML using the same editor rules as the document body. |
note | string | No | Supporting note as raw HTML (e.g. Note ). Renders on the published document and public share links — do NOT put private context here. Pass real tags, not entity-escaped markup (<p>). Fully entity-escaped notes are auto-corrected; notes mixing escaped markup with real tags are rejected with an error asking you to resend raw HTML. |
state | integer | No | Document state: 0=GREY, 1=ORANGE, 2=RED, 3=GREEN, 4=PURPLE |
reviewDate | string (date-time) or null | No | Review date in ISO 8601 format (e.g. “2030-01-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. |
owner | string (uuid) | No | UUID of the new primary owner |
secondaryOwner | string (uuid) or null | No | UUID of the new secondary owner, or null to remove (resets to primary owner) |
publishTitle | string | No | Optional version title/label for the published version (e.g. ‘v1.0 - Initial release’) |
Returns
| Field | Type | Notes |
|---|---|---|
id | string (uuid) | Unique identifier of the updated document |
title | string | Current title after update |
type | number | Item type: 1=FOLDER, 2=DOCUMENT |
state | number | Document state: 0=GREY, 1=ORANGE, 2=RED, 3=GREEN, 4=PURPLE |
reviewDate | string or null | ISO timestamp of the next scheduled review, or null if not set |
published | boolean | Background publish status (for agent verification only). Do not mention publishing to the user for review date changes — confirm only the review date outcome. |
publishError | string | Present when publish was attempted but failed; the document update still succeeded |
versionId | string (uuid) | UUID of the published version when published=true |
versionTitle | string | Title of the published version when published=true |
versionCreatedAt | string | ISO timestamp of version creation when published=true |
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, note, state (0=GREY, 1=ORANGE, 2=RED, 3=GREEN, 4=PURPLE), reviewDate, owner (primary owner UUID), or secondaryOwner (secondary owner UUID, or null to remove). Only provided fields are changed; omitted fields remain untouched. For small text/link fixes inside HTML content, prefer edit_training_content (find/replace) instead of resupplying the full content string. Edits are always published automatically so assigned users can see them — do not ask the user to confirm publishing. 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. To mark overdue, set state: 2 (RED) separately.
| Parameter | Type | Required | Notes |
|---|---|---|---|
id | string (uuid) | Yes | UUID of the training document to update |
title | string | No | New title |
content | string | No | New document content as raw HTML (e.g. Title). Pass real tags, not entity-escaped markup (<h2>). Fully entity-escaped content is auto-corrected; content mixing escaped markup with real tags is rejected with an error asking you to resend raw HTML. |
description | string | No | New HTML overview (not plain text). Accepts, stores, and renders HTML using the same editor rules as the document body. |
note | string | No | Supporting note as raw HTML (e.g. Note ). Renders on the published document and public share links — do NOT put private context here. Pass real tags, not entity-escaped markup (<p>). Fully entity-escaped notes are auto-corrected; notes mixing escaped markup with real tags are rejected with an error asking you to resend raw HTML. |
state | integer | No | Document state: 0=GREY, 1=ORANGE, 2=RED, 3=GREEN, 4=PURPLE |
reviewDate | string (date-time) or null | No | Review date in ISO 8601 format (e.g. “2030-01-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. |
owner | string (uuid) | No | UUID of the new primary owner |
secondaryOwner | string (uuid) or null | No | UUID of the new secondary owner, or null to remove (resets to primary owner) |
publishTitle | string | No | Optional version title/label for the published version (e.g. ‘v1.0 - Initial release’) |
Returns
| Field | Type | Notes |
|---|---|---|
id | string (uuid) | Unique identifier of the updated training document |
title | string | Current title after update |
type | number | Item type: 1=FOLDER, 2=DOCUMENT |
state | number | Document state: 0=GREY, 1=ORANGE, 2=RED, 3=GREEN, 4=PURPLE |
reviewDate | string or null | ISO timestamp of the next scheduled review, or null if not set |
published | boolean | Background publish status (for agent verification only). Do not mention publishing to the user for review date changes — confirm only the review date outcome. |
publishError | string | Present when publish was attempted but failed; the document update still succeeded |
versionId | string (uuid) | UUID of the published version when published=true |
versionTitle | string | Title of the published version when published=true |
versionCreatedAt | string | ISO timestamp of version creation when published=true |
edit_system_content
Performs surgical find-and-replace on a system document’s HTML content without requiring the agent to resupply the full body. Provide id and replacements: [{ find, replace }, …]. Replacements are literal (not regex) and applied sequentially. Errors if any find string is missing (never silently no-ops) or if expectMatches is set and the total match count differs. Prefer this over edit_system for small text/link fixes to save tokens and avoid HTML transcription errors. Edits are always published automatically.
| Parameter | Type | Required | Notes |
|---|---|---|---|
id | string (uuid) | Yes | UUID of the system document whose content to patch |
replacements | array of object | Yes | Ordered list of literal find/replace operations applied sequentially to document.content. Prefer this over edit_system when changing a small substring (links, phrases) so the full HTML body is not re-uploaded by the agent. |
expectMatches | integer | No | Optional safety check: total number of matches across all replacements must equal this value, otherwise the tool errors and makes no changes. Omit to allow any positive match count. |
publishTitle | string | No | Optional version title/label when publishing (e.g. ‘Fix CTA link’) |
Returns
| Field | Type | Notes |
|---|---|---|
id | string (uuid) | Unique identifier of the updated document |
title | string | Current title after update |
totalMatches | integer | Total number of find-string matches replaced |
replacements | array of object | Per-replacement match counts Contains: find, replace, matchCount |
published | boolean | Whether a new version was published after the content patch |
publishError | string | Present when publish was attempted but failed; the content update still succeeded |
versionId | string (uuid) | UUID of the published version when published=true |
versionTitle | string | Title of the published version when published=true |
versionCreatedAt | string | ISO timestamp of version creation when published=true |
edit_policy_content
Performs surgical find-and-replace on a policy document’s HTML content without requiring the agent to resupply the full body. Provide id and replacements: [{ find, replace }, …]. Replacements are literal (not regex) and applied sequentially. Errors if any find string is missing (never silently no-ops) or if expectMatches is set and the total match count differs. Prefer this over edit_policy for small text/link fixes to save tokens and avoid HTML transcription errors. Edits are always published automatically.
| Parameter | Type | Required | Notes |
|---|---|---|---|
id | string (uuid) | Yes | UUID of the policy document whose content to patch |
replacements | array of object | Yes | Ordered list of literal find/replace operations applied sequentially to document.content. Prefer this over edit_policy when changing a small substring (links, phrases) so the full HTML body is not re-uploaded by the agent. |
expectMatches | integer | No | Optional safety check: total number of matches across all replacements must equal this value, otherwise the tool errors and makes no changes. Omit to allow any positive match count. |
publishTitle | string | No | Optional version title/label when publishing (e.g. ‘Fix CTA link’) |
Returns
| Field | Type | Notes |
|---|---|---|
id | string (uuid) | Unique identifier of the updated document |
title | string | Current title after update |
totalMatches | integer | Total number of find-string matches replaced |
replacements | array of object | Per-replacement match counts Contains: find, replace, matchCount |
published | boolean | Whether a new version was published after the content patch |
publishError | string | Present when publish was attempted but failed; the content update still succeeded |
versionId | string (uuid) | UUID of the published version when published=true |
versionTitle | string | Title of the published version when published=true |
versionCreatedAt | string | ISO timestamp of version creation when published=true |
edit_training_content
Performs surgical find-and-replace on a training document’s HTML content without requiring the agent to resupply the full body. Provide id and replacements: [{ find, replace }, …]. Replacements are literal (not regex) and applied sequentially. Errors if any find string is missing (never silently no-ops) or if expectMatches is set and the total match count differs. Prefer this over edit_training for small text/link fixes to save tokens and avoid HTML transcription errors. Edits are always published automatically.
| Parameter | Type | Required | Notes |
|---|---|---|---|
id | string (uuid) | Yes | UUID of the training document whose content to patch |
replacements | array of object | Yes | Ordered list of literal find/replace operations applied sequentially to document.content. Prefer this over edit_training when changing a small substring (links, phrases) so the full HTML body is not re-uploaded by the agent. |
expectMatches | integer | No | Optional safety check: total number of matches across all replacements must equal this value, otherwise the tool errors and makes no changes. Omit to allow any positive match count. |
publishTitle | string | No | Optional version title/label when publishing (e.g. ‘Fix CTA link’) |
Returns
| Field | Type | Notes |
|---|---|---|
id | string (uuid) | Unique identifier of the updated document |
title | string | Current title after update |
totalMatches | integer | Total number of find-string matches replaced |
replacements | array of object | Per-replacement match counts Contains: find, replace, matchCount |
published | boolean | Whether a new version was published after the content patch |
publishError | string | Present when publish was attempted but failed; the content update still succeeded |
versionId | string (uuid) | UUID of the published version when published=true |
versionTitle | string | Title of the published version when published=true |
versionCreatedAt | string | ISO timestamp of version creation when published=true |
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.
✅ What a restore actually brings back (our test, production, 25 Oct 2026). On a throwaway document: body, Overview (
description),noteand tags all came back, including removing a tag added after the snapshot.reviewDatedid not and kept its current value — consistent with the list above, which never promises it. Videos, templates and attachments were not covered by that test. So publishing before a rewrite is a real safety net for content and metadata; set the review date again by hand after a restore. This replaces an earlier caveat of ours, based on a 9 Aug 2026 test of the older UI restore path, which said a restore returned only the body.
| 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’) |
Returns
| Field | Type | Notes |
|---|---|---|
versionId | string (uuid) | UUID of the created version |
title | string | Version title |
createdAt | string | ISO timestamp of version creation |
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.
✅ What a restore actually brings back (our test, production, 25 Oct 2026). On a throwaway document: body, Overview (
description),noteand tags all came back, including removing a tag added after the snapshot.reviewDatedid not and kept its current value — consistent with the list above, which never promises it. Videos, templates and attachments were not covered by that test. So publishing before a rewrite is a real safety net for content and metadata; set the review date again by hand after a restore. This replaces an earlier caveat of ours, based on a 9 Aug 2026 test of the older UI restore path, which said a restore returned only the body.
| 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’) |
Returns
| Field | Type | Notes |
|---|---|---|
versionId | string (uuid) | UUID of the created version |
title | string | Version title |
createdAt | string | ISO timestamp of version creation |
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.
✅ What a restore actually brings back (our test, production, 25 Oct 2026). On a throwaway document: body, Overview (
description),noteand tags all came back, including removing a tag added after the snapshot.reviewDatedid not and kept its current value — consistent with the list above, which never promises it. Videos, templates and attachments were not covered by that test. So publishing before a rewrite is a real safety net for content and metadata; set the review date again by hand after a restore. This replaces an earlier caveat of ours, based on a 9 Aug 2026 test of the older UI restore path, which said a restore returned only the body.
| 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’) |
Returns
| Field | Type | Notes |
|---|---|---|
versionId | string (uuid) | UUID of the created version |
title | string | Version title |
createdAt | string | ISO timestamp of version creation |
Version history
list_document_versions
Lists immutable published version snapshots for a system, policy, or training document, newest first. Each snapshot has a versionId, title, and createdAt. Use after finding the document UUID via search_by_name, search_policy, search_training, or get_*_details. Call this before restore_document_version to choose which snapshot to roll back to. Does not return version body content — restore to apply a snapshot to the live document. When presenting version history, list newest first. For each snapshot show title, createdAt, and versionId, and tell the user they must restore by versionId — never by date or timestamp. If the user names only a date, call list_document_versions, show matching rows with their versionIds, and ask which versionId to restore. Do not pick a snapshot from a date yourself. The latest row is the currently published snapshot assigned users see. Restore copies that snapshot onto the live document and publishes a new snapshot on top of history — then hard-refresh the document in SystemHub.
| 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. |
page | integer | No | Page number when not using fetchAll (default 1) |
limit | integer | No | Results per page when not using fetchAll (default 50, max 100) |
fetchAll | boolean | No | When true (default), fetches version pages until complete (up to 500 snapshots) so the full history is available for restore. |
Returns
| Field | Type | Notes |
|---|---|---|
documentId | string (uuid) | UUID of the document whose versions were listed |
versions | array of object | Published snapshots, newest first. Empty when the document has never been published. Contains: versionId, title, createdAt, isLatest |
latestVersionId | string (uuid) or null | UUID of the newest published snapshot, or null when never published |
summary | object | Counts derived from the fetched versions Contains: totalVersions |
hasMore | boolean | True when pagination was used and more pages may exist — increase page or set fetchAll=true |
restore_document_version
Restores a previous published snapshot onto the live system, policy, or training document. Requires documentId and versionId. Ask the user for the versionId (a UUID from list_document_versions) — do not restore from a date, timestamp, or title, and do not guess which snapshot matches a date. If the user only names a date, list versions, show each versionId, and wait for them to pick one. Restore copies that snapshot’s content, description, notes, tags, videos, templates, and attachments onto the live document. Always publishes afterwards so the SystemHub UI (view mode) shows the rolled-back body — that creates a new snapshot on top of history; the restored versionId is unchanged. After restore, hard-refresh the document in the app.
| Parameter | Type | Required | Notes |
|---|---|---|---|
documentId | string (uuid) | Yes | UUID of the system, policy, or training document to restore. Find it via search_by_name, search_policy, search_training, or get_*_details. |
versionId | string (uuid) | Yes | UUID of the published snapshot to restore. Required. Get it from list_document_versions (or get_details / publish). Never pass a date, timestamp, or version title — those are not versionId. |
versionTitle | string | No | Optional title for the new published snapshot after restore (e.g. ‘Restored v1.0’). Uses a timestamp if omitted. |
Returns
| Field | Type | Notes |
|---|---|---|
documentId | string (uuid) | UUID of the document that was restored |
restoredVersionId | string (uuid) | UUID of the historical snapshot that was applied to the live document |
restoredVersionTitle | string | Title of the restored snapshot |
restoredVersionCreatedAt | string | ISO timestamp when the restored snapshot was originally published |
published | object or null | New published snapshot created after restore so the UI/view mode shows the rolled-back content. This is a copy of the restored snapshot, not a replacement of history. Null when publish failed. |
publishError | string | Present when publish was requested but creating the new snapshot failed |
Visual canvas
get_document_canvas
Reads the visual-builder canvas on a system, policy, or training document. Returns a compact flow graph (nodes with labels/shapes and directed edges) — not HTML content. Use this before editing a canvas, or to describe how an existing SOP/CCF diagram flows. Folders have no canvas. When hasCanvas is false, the document has no diagram yet. To create a new canvas, call set_document_canvas directly, then share the document reviewUrl so the user can verify it in the SystemHub web app.
| 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. |
topicType | enum: system · policy · training | Yes | Document section: “system” for procedures, “policy” for compliance documents, “training” for learning modules. |
Returns
| Field | Type | Notes |
|---|---|---|
documentId | string (uuid) | UUID of the document |
topicType | enum: system · policy · training | Document section that was used |
title | string | Document title |
hasCanvas | boolean | True when the document currently has at least one canvas node |
nodeCount | integer | Number of nodes on the canvas |
edgeCount | integer | Number of connections on the canvas |
canvas | object | Compact flow graph (ids, labels, shapes, optional leftOf row titles, connections). Empty nodes/edges when no canvas exists. Contains: nodes, edges |
set_document_canvas
Creates or replaces a visual-builder canvas on a system, policy, or training document. Call this directly when the user asks to create a canvas — do not wait for preview approval. Chat/PNG previews often do not match the SystemHub web builder. After saving, share reviewUrl and ask the user to open the document in the web app to review and edit the Canvas block. preview_document_canvas is optional only. A PNG is attached as an approximate image; do not paste base64. This replaces the entire canvas. Folders are rejected. Always published automatically. REQUIRED after saving: tell the user the canvas was written to the document, share reviewUrl (the SystemHub document link), and ask them to open it in the web app to review and adjust the Canvas block. Chat/PNG previews are approximate and often do not match how the diagram looks in SystemHub — the web editor is the source of truth. Do not paste previewPng, base64, or markdown images into the reply.
| Parameter | Type | Required | Notes |
|---|---|---|---|
documentId | string (uuid) | Yes | UUID of the system, policy, or training document that should receive the canvas. Find it via search_by_name, search_policy, search_training, or get_*_details. |
topicType | enum: system · policy · training | Yes | Document section: “system” for procedures, “policy” for compliance documents, “training” for learning modules. |
layout | enum: TB · LR | No | Auto-layout direction. Omit for TB (top-to-bottom SOP/CCF flow). Use LR for left-to-right. |
nodes | array of object | Yes | Canvas nodes in flow order. Describe the process — do not send x/y coordinates. The server places nodes. Use diamond for decisions, round-rectangle for steps. For CCF-style row titles (Attention, Enquiry) add a textNode with leftOf set to that row’s step id; it is placed at the same Y, smaller X. |
edges | array of object | No | Directed connections. from/to must match node ids. Optional label for Yes/No or handoff arrows. Omit for an unconnected set of nodes. |
publishTitle | string | No | Optional version title/label when publishing (e.g. ‘v1.0 - Canvas’). |
Returns
| Field | Type | Notes |
|---|---|---|
documentId | string (uuid) | UUID of the updated document |
topicType | enum: system · policy · training | Document section that was used |
title | string | Document title |
layout | enum: TB · LR | Layout direction applied |
nodeCount | integer | Number of nodes written to the canvas |
edgeCount | integer | Number of connections written to the canvas |
canvas | object | Flow graph that was saved Contains: nodes, edges |
reviewUrl | string (uri) | SystemHub document URL. REQUIRED: share this with the user and ask them to open the Canvas block in the web app to review and edit. Do not treat chat/PNG previews as final. |
reviewReminder | string | Always remind the user: chat/PNG previews often do not match the web visual builder — open reviewUrl in SystemHub to verify. |
previewPng | string | Approximate PNG of the saved canvas (base64). Do not paste this into the reply. It is attached as an image automatically. Prefer reviewUrl for accurate review. |
published | boolean | Whether a version snapshot was published |
publishError | string | Present when publish was attempted but failed; the canvas update still succeeded |
versionId | string (uuid) | UUID of the published version when published=true |
versionTitle | string | Title of the published version when published=true |
versionCreatedAt | string | ISO timestamp of version creation when published=true |
preview_document_canvas
Optional dry-run: previews a visual-builder canvas without writing it. Prefer set_document_canvas to create the canvas directly — do not require user approval from this preview, because PNG/chat previews often do not match the SystemHub web builder. Use this only if you want a quick approximate look before saving. Does not change the document. Folders are rejected. OPTIONAL helper only — do not block saving on this preview. A PNG is attached as an image; write a short explanation if useful. Do not paste previewMarkdown, data URIs, base64, mermaid, or SVG into the reply — Cursor shows those as code, not as a picture. PNG/chat previews often do not match the SystemHub web visual builder, so do not ask the user to approve from the preview alone. Prefer set_document_canvas to create the canvas, then give them reviewUrl to check and edit in the app. If replacesExistingCanvas is true, warn that saving will replace the current diagram.
| Parameter | Type | Required | Notes |
|---|---|---|---|
documentId | string (uuid) | Yes | UUID of the system, policy, or training document this canvas would be saved to. Find it via search_by_name, search_policy, search_training, or get_*_details. |
topicType | enum: system · policy · training | Yes | Document section: “system” for procedures, “policy” for compliance documents, “training” for learning modules. |
layout | enum: TB · LR | No | Auto-layout direction. Omit for TB (top-to-bottom SOP/CCF flow). Use LR for left-to-right. |
nodes | array of object | Yes | Canvas nodes in flow order. Describe the process — do not send x/y coordinates. The server places nodes. Use diamond for decisions, round-rectangle for steps. For CCF-style row titles (Attention, Enquiry) add a textNode with leftOf set to that row’s step id; it is placed at the same Y, smaller X. |
edges | array of object | No | Directed connections. from/to must match node ids. Optional label for Yes/No or handoff arrows. Omit for an unconnected set of nodes. |
Returns
| Field | Type | Notes |
|---|---|---|
documentId | string (uuid) | UUID of the target document |
topicType | enum: system · policy · training | Document section that was used |
title | string | Document title |
layout | enum: TB · LR | Layout direction used for this preview |
wroteToDocument | boolean | Always false. This tool never writes. The document is unchanged until set_document_canvas. |
replacesExistingCanvas | boolean | True when the document already has a canvas that would be replaced on save |
existingNodeCount | integer | How many nodes are on the current canvas (0 if none) |
nodeCount | integer | How many nodes would be saved |
edgeCount | integer | How many connections would be saved |
layoutPreview | string | Markdown map of the canvas. Optional extra context under the image. Do not show this instead of the image. |
previewPng | string | PNG of the canvas (base64). Do not paste this into the reply. It is attached as an image automatically. |
mermaid | string | Mermaid syntax for the graph. Do not show this as the user preview; use layoutPreview instead. Mermaid source is not the canvas layout. |
canvas | object | Compact flow graph that would be saved by set_document_canvas Contains: nodes, edges |
clear_document_canvas
Removes the visual-builder canvas from a system, policy, or training document. The HTML body is left unchanged. After this, the SystemHub UI hides the Canvas block. Use set_document_canvas to create a new diagram. Always published automatically.
| Parameter | Type | Required | Notes |
|---|---|---|---|
documentId | string (uuid) | Yes | UUID of the system, policy, or training document whose canvas should be removed. Find it via search_by_name, search_policy, search_training, or get_*_details. |
topicType | enum: system · policy · training | Yes | Document section: “system” for procedures, “policy” for compliance documents, “training” for learning modules. |
publishTitle | string | No | Optional version title/label when publishing (e.g. ‘Removed canvas’). |
Returns
| Field | Type | Notes |
|---|---|---|
documentId | string (uuid) | UUID of the updated document |
topicType | enum: system · policy · training | Document section that was used |
title | string | Document title |
hasCanvas | boolean | Always false after a successful clear |
published | boolean | Whether a version snapshot was published |
publishError | string | Present when publish was attempted but failed; the canvas clear still succeeded |
versionId | string (uuid) | UUID of the published version when published=true |
versionTitle | string | Title of the published version when published=true |
versionCreatedAt | string | ISO timestamp of version creation when published=true |
Organising
move_system
Moves a system document into a different system folder. Provide the document UUID and the destination folder UUID (use get_folder_tree to locate folders). The document stays a system. To move it into a policy or training folder, use move_document. 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) |
Returns
| Field | Type | Notes |
|---|---|---|
id | string (uuid) | Unique identifier of the moved document |
title | string | Title of the document |
type | number | Item type: 2=DOCUMENT |
parent | string (uuid) or null | UUID of the parent folder after the move |
move_policy
Moves a policy document into a different policy folder. Provide the document UUID and the destination folder UUID (use get_policy_tree to locate folders). The document stays a policy. To move it into a system or training folder, use move_document. 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) |
Returns
| Field | Type | Notes |
|---|---|---|
id | string (uuid) | Unique identifier of the moved document |
title | string | Title of the document |
type | number | Item type: 2=DOCUMENT |
parent | string (uuid) or null | UUID of the parent folder after the move |
move_training
Moves a training document into a different training folder. Provide the document UUID and the destination folder UUID (use get_training_tree to locate folders). The document stays a training. To move it into a system or policy folder, use move_document. 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) |
Returns
| Field | Type | Notes |
|---|---|---|
id | string (uuid) | Unique identifier of the moved document |
title | string | Title of the document |
type | number | Item type: 2=DOCUMENT |
parent | string (uuid) or null | UUID of the parent folder after the move |
move_document
Moves a system, policy, or training document into a folder, including a folder in a different section. Same-section moves only change the folder. Cross-section moves convert the document (for example a system into a training folder) using the same rules as the web app. Moves into Training are allowed. Moving a training that has learning track steps out of Training returns a warning and keeps those steps on the document. If source does not match the document, the call fails and names the real section so you can retry. Use move_system, move_policy, or move_training when the document stays in the same section. Requires move permission on the document.
| Parameter | Type | Required | Notes |
|---|---|---|---|
id | string (uuid) | Yes | UUID of the document to move |
parent | string (uuid) | Yes | UUID of the destination folder |
source | enum: system · policy · training | Yes | Section the document is in now: system, policy, or training |
destination | enum: system · policy · training | Yes | Section of the destination folder: system, policy, or training. Use the folder tree for that section to confirm the folder id. |
Returns
| Field | Type | Notes |
|---|---|---|
id | string (uuid) | Unique identifier of the moved document |
title | string | Title of the document |
type | number | Item type: 2=DOCUMENT |
parent | string (uuid) or null | UUID of the parent folder after the move |
discriminator | enum: system · policy · training | Section the document belongs to after the move |
converted | boolean | True when the document changed section (system, policy, or training) |
warning | string or null | Set when a training with learning track steps is moved out of Training; otherwise null |
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 |
Returns
| Field | Type | Notes |
|---|---|---|
id | string (uuid) | Unique identifier of the renamed folder |
title | string | Updated folder name |
type | number | Item type: 1=FOLDER |
parent | string (uuid) or null | UUID of the parent folder, or null for root level |
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 |
Returns
| Field | Type | Notes |
|---|---|---|
id | string (uuid) | Unique identifier of the renamed folder |
title | string | Updated folder name |
type | number | Item type: 1=FOLDER |
parent | string (uuid) or null | UUID of the parent folder, or null for root level |
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 |
Returns
| Field | Type | Notes |
|---|---|---|
id | string (uuid) | Unique identifier of the renamed folder |
title | string | Updated folder name |
type | number | Item type: 1=FOLDER |
parent | string (uuid) or null | UUID of the parent folder, or null for root level |
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. Always publishes the document after adding templates so they are visible outside edit mode.
| 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. |
templates | array of object | Yes | Templates to add. Each entry requires title, subject, and details. Example: [{ “title”: “Welcome Email”, “subject”: “Your login details”, “details”: “ Hi {{name}}, welcome! ” }] |
versionTitle | string | No | Optional version title for the published version (e.g. ‘Updated templates’). Uses a timestamp if omitted. |
Returns
| Field | Type | Notes |
|---|---|---|
documentId | string (uuid) | UUID of the updated document |
added | array of object | Templates successfully added to the document Contains: id, title, subject, details |
skipped | array of object | Templates skipped because the title already exists Contains: title, reason |
published | object or null | Published version snapshot; null when nothing changed |
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. Always publishes the document after editing so changes are visible outside edit mode.
| 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. |
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 for the published version (e.g. ‘Updated templates’). Uses a timestamp if omitted. |
Returns
| Field | Type | Notes |
|---|---|---|
documentId | string (uuid) | UUID of the updated document |
updated | array of object | Templates successfully updated on the document Contains: id, title, subject, details |
skipped | array of object | Template edits that were not applied (not found or title conflict) Contains: currentTitle, reason |
published | object or null | Published version snapshot; null when nothing changed |
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). Always publishes the document after removing templates so changes are visible outside edit mode. 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. |
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 for the published version (e.g. ‘Updated templates’). Uses a timestamp if omitted. |
Returns
| Field | Type | Notes |
|---|---|---|
documentId | string (uuid) | UUID of the updated document |
removed | array of object | Templates successfully removed from the document Contains: id, title, subject, details |
skipped | array of object | Template titles that were not on the document Contains: title, reason |
published | object or null | Published version snapshot; null when nothing changed |
add_document_videos_and_media
Adds one or more Videos & Media entries (media link URLs — videos, 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. Always publishes the document after adding so changes are visible outside edit mode.
| 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://www.loom.com/share/abc”, “title”: “Product walkthrough” }, { “videoLink”: “https://www.youtube.com/watch?v=abc123” }] |
versionTitle | string | No | Optional version title for the published version (e.g. ‘Updated Videos & Media’). Uses a timestamp if omitted. |
Returns
| Field | Type | Notes |
|---|---|---|
documentId | string (uuid) | UUID of the updated document |
added | array of object | Videos & Media entries successfully added to the document Contains: id, title, videoLink |
skipped | array of object | Entries skipped because the link already exists on the document Contains: videoLink, reason |
published | object or null | Published version snapshot; null when nothing changed |
remove_document_videos_and_media
Removes one or more Videos & Media entries (media link URLs — videos, 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). Always publishes the document after removal so changes are visible outside edit mode. 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. |
videoIds | array of string (uuid) | No | Videos & Media entry UUIDs to remove. Use the id from get_details or search videosAndMedia entries. |
titles | array of string | No | Entry titles to remove (case-insensitive). Use when the entry has a title set. |
videoLinks | array of string | No | Media link URLs to remove (exact match). Use when title is null or to target a specific link. |
versionTitle | string | No | Optional version title for the published version (e.g. ‘Updated Videos & Media’). Uses a timestamp if omitted. |
Returns
| Field | Type | Notes |
|---|---|---|
documentId | string (uuid) | UUID of the updated document |
removed | array of object | Videos & Media entries successfully removed Contains: id, title, videoLink |
skipped | array of object | Videos & Media entries that were not on the document Contains: id, title, videoLink, reason |
published | object or null | Published version snapshot; null when nothing changed |
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 reused when the title matches, ignoring capitalisation. Unknown titles create new tags. Tags cannot be applied to folders. Always publishes the document after adding tags so they are visible outside edit mode (same as publish_policy/publish_system/publish_training). 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. |
tags | array of string | Yes | Tag titles to add. Existing tags are reused when the title matches, ignoring capitalisation. New titles create tags automatically. Example: [“Model Context Protocol”, “Compliance”] |
versionTitle | string | No | Optional version title for the published version (e.g. ‘Updated tags’). Uses a timestamp if omitted. |
Returns
| Field | Type | Notes |
|---|---|---|
documentId | string (uuid) | UUID of the tagged document |
added | array of object | Tags successfully added to the document Contains: id, title, createdAt, created |
skipped | array of object | Tags that were already on the document Contains: title, reason |
published | object or null | Published version snapshot; null when nothing changed |
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. Always publishes the document after removing tags so changes are visible outside edit mode. 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. |
tags | array of string | Yes | Tag titles to remove from the document. Example: [“Model Context Protocol”, “Compliance”] |
versionTitle | string | No | Optional version title for the published version (e.g. ‘Updated tags’). Uses a timestamp if omitted. |
Returns
| Field | Type | Notes |
|---|---|---|
documentId | string (uuid) | UUID of the updated document |
removed | array of object | Tags successfully removed from the document Contains: id, title, createdAt |
skipped | array of object | Tags that were not on the document Contains: title, reason |
published | object or null | Published version snapshot; null when nothing changed |
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. |
parentFolderId | string (uuid) | No | Default attachment folder UUID for all files. Per-file parentFolderId overrides this. Omit to upload to the document root. |
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. |
versionTitle | string | No | Optional version title for the published version (e.g. ‘Updated attachments’). Uses a timestamp if omitted. |
Returns
| Field | Type | Notes |
|---|---|---|
documentId | string (uuid) | UUID of the updated document |
added | array of object | Files successfully uploaded to the document Contains: id, title, type, downloadUrl |
skipped | array of object | Files that were not uploaded Contains: fileName, reason, detail |
published | object or null | Published version snapshot; null when nothing changed |
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 (renders @-tags in the comment and sends mention notifications; unknown user IDs error). Notifications are also sent for new comments and replies. Retrying the same payload after a timeout returns the original comment instead of posting a duplicate.
| 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. |
text | string | Yes | Comment body text |
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. |
topicType | enum: description · content · note | No | Source of quoted text: “description” (Overview), “content” (Details), or “note” (Notes). Required when quote is provided. |
mentions | array of string (uuid) | No | Optional user UUIDs to @-mention and notify. Prefer this array as the source of truth — do not also type literal “@Full Name” in text for the same people (the server upgrades those in place, but the array alone is enough). Use get_document_members_and_roles or list_company_members for IDs. Mentions do not require document membership. Unknown user IDs return an error. |
Returns
| Field | Type | Notes |
|---|---|---|
documentId | string (uuid) | UUID of the document that was commented on |
comment | object | The created comment Contains: id, parentId, createdAt, author, text, quote, topicType, mentions |
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 |
|---|---|---|---|
trainingId | string (uuid) | Yes | UUID of the training document to add the learning track to |
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. |
title | string | No | Optional title for the learning track entry; defaults to the base item title |
estimatedTime | string | No | Estimated time to complete (e.g. “15 min”, “1 hour”) |
Returns
| Field | Type | Notes |
|---|---|---|
id | string (uuid) | Unique identifier of the created learning track |
training | string (uuid) | UUID of the parent training |
baseItem | string (uuid) | UUID of the linked base item |
title | string | Title of the learning track entry |
estimatedTime | string or null | Estimated completion time |
createdAt | string | ISO timestamp of creation |
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 |
|---|---|---|---|
trainingId | string (uuid) | Yes | UUID of the parent training document |
learningId | string (uuid) | Yes | UUID of the learning track entry to update |
title | string | No | New title for the learning track entry |
estimatedTime | string | No | New estimated completion time (e.g. “15 min”, “1 hour”) |
baseItem | string (uuid) | No | UUID of a different base item to link |
Returns
| Field | Type | Notes |
|---|---|---|
id | string (uuid) | Unique identifier of the updated learning track |
training | string (uuid) | UUID of the parent training |
baseItem | string (uuid) | UUID of the linked base item |
title | string | Title of the learning track entry |
estimatedTime | string or null | Estimated completion time |
createdAt | string | ISO timestamp of creation |
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). Always publishes the training after removal so changes are visible outside edit mode. Returns which steps were removed and which were not found.
| Parameter | Type | Required | Notes |
|---|---|---|---|
trainingId | string (uuid) | Yes | UUID of the training document. Use search_training or get_training_details to find the training ID first. |
learningTrackIds | array of string (uuid) | No | Learning track entry UUIDs to remove. Use id from learningTracks in get_training_details or search_training. |
titles | array of string | No | Curriculum step titles to remove (case-insensitive). |
baseItems | array of string (uuid) | No | Linked document UUIDs to remove (matches learning track baseItem). |
versionTitle | string | No | Optional version title for the published version (e.g. ‘Updated learning track’). Uses a timestamp if omitted. |
Returns
| Field | Type | Notes |
|---|---|---|
trainingId | string (uuid) | UUID of the updated training document |
removed | array of object | Learning track steps successfully removed Contains: id, baseItem, title, estimatedTime, discriminator, sortOrder, createdAt |
skipped | array of object | Learning track steps that were not found on this training Contains: id, title, baseItem, reason |
published | object or null | Published version snapshot; null when nothing changed |
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.