Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
PORTNoPort for the HTTP server (default 8090)8090
SRG_API_KEYYesYour SRG+ API key (required for local stdio mode)
OAUTH_ISSUERNoCanonical issuer URL for OAuth (optional; random ephemeral if unset)
OAUTH_TOKEN_SIGNING_KEYNoHMAC key for codes/access/refresh tokens (optional; random ephemeral if unset)
OAUTH_API_KEY_ENCRYPTION_KEYNo32-byte AES-GCM key (base64url) for wrapping the SRG+ workspace api_key inside JWTs (optional; random ephemeral if unset)
OAUTH_CLIENT_REGISTRATION_KEYNoHMAC key for DCR client_id JWTs (optional; random ephemeral if unset)

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
list_hub_profilesA

List all hub profiles in a workspace.

workspace_id: target workspace ID — get available IDs from list_workspaces()
list_managed_hub_profilesA

List hub profiles where the current API key user has Admin or Editor role.

workspace_id: target workspace ID — get available IDs from list_workspaces()
get_hub_profileA

Get full hub profile details by ID.

workspace_id: target workspace ID — get available IDs from list_workspaces()
get_hub_profile_by_usernameB

Get hub profile details by its URL username/slug.

workspace_id: target workspace ID — get available IDs from list_workspaces()
filter_hub_profilesA

Batch-fetch lightweight hub profile data for a list of IDs.

workspace_id: target workspace ID — get available IDs from list_workspaces()
availability_level: "Public" or "Private" to filter by visibility
create_hub_profileA

Create a new hub profile in a workspace.

workspace_id: target workspace ID — get available IDs from list_workspaces()
availability_level: "Public" (default) or "Private"
primary_url: optional external URL shown on the profile
app_clip_on: enable iOS App Clip
widgets: profile widget configuration objects
buttons: action buttons, each
    {"title": "...", "logic": {"type": "...", "url": "..."}}
update_hub_profileA

Update an existing hub profile's metadata.

All fields are overwritten — provide the full desired state.
workspace_id: target workspace ID — get available IDs from list_workspaces()
availability_level: "Public" or "Private"
primary_url: optional external URL shown on the profile
app_clip_on: enable iOS App Clip
widgets: profile widget configuration objects (replaces existing)
buttons: action buttons (replaces existing), each
    {"title": "...", "logic": {"type": "...", "url": "..."}}
archive_hub_profileA

Archive a hub profile (hidden from listings, content preserved).

workspace_id: target workspace ID — get available IDs from list_workspaces()
restore_hub_profileA

Restore a previously archived hub profile.

workspace_id: target workspace ID — get available IDs from list_workspaces()
delete_hub_profileA

Permanently delete a hub profile and all its data. Irreversible.

workspace_id: target workspace ID — get available IDs from list_workspaces()
join_hub_profileA

Join a public hub profile as the current API key user.

workspace_id: target workspace ID — get available IDs from list_workspaces()
move_hub_profile_to_workspaceA

Transfer a hub profile to a different workspace (preserves content).

turn_on_hub_profile_communityB

Enable community features for a hub profile (posts, comments, reactions).

workspace_id: target workspace ID — get available IDs from list_workspaces()
list_channelsB

List all channels for a hub profile.

workspace_id: target workspace ID — get available IDs from list_workspaces()
get_channelA

Get full channel details by ID (includes categories and heading content).

workspace_id: target workspace ID — get available IDs from list_workspaces()
get_channel_by_nameB

Get channel details by hub profile username slug and channel name slug.

workspace_id: target workspace ID — get available IDs from list_workspaces()
create_channelA

Create a new channel in a hub profile. Returns the new channel ID.

workspace_id: target workspace ID — get available IDs from list_workspaces()
privacy: "Private" (default) or "Public"
update_channelB

Update a channel's name, privacy, and category order.

workspace_id: target workspace ID — get available IDs from list_workspaces()
privacy: "Public" or "Private"
categories: list of {"id": "...", "order": 0} to reorder categories
archive_channelA

Archive a channel (hidden from members, content preserved).

workspace_id: target workspace ID — get available IDs from list_workspaces()
restore_channelB

Restore a previously archived channel.

workspace_id: target workspace ID — get available IDs from list_workspaces()
delete_channelA

Permanently delete a channel and all its categories/sections. Irreversible.

workspace_id: target workspace ID — get available IDs from list_workspaces()
create_categoryA

Create a new category inside a channel. Returns the new category ID.

workspace_id: target workspace ID — get available IDs from list_workspaces()
view_type: display view type (e.g. "Grid", "List")
progression_enabled: track user completion progress
cover_show: show cover images in this category
expandable: allow the category to be collapsed
sections: list of {"name": "...", "type": "...", "reference_ids": [...]} for initial sections
update_categoryA

Update a category's name, pin status, notification settings, and display options.

workspace_id: target workspace ID — get available IDs from list_workspaces()
view_type: display view type (e.g. "Grid", "List")
progression_enabled: track user completion progress
cover_show: show cover images in this category
expandable: allow the category to be collapsed
archive_categoryC

Archive a category inside a channel.

workspace_id: target workspace ID — get available IDs from list_workspaces()
restore_categoryA

Restore a previously archived category inside a channel.

workspace_id: target workspace ID — get available IDs from list_workspaces()
delete_categoryA

Permanently delete a category from a channel. Irreversible.

workspace_id: target workspace ID — get available IDs from list_workspaces()
get_category_referencesC

List content references in a category with cursor-based pagination.

workspace_id: target workspace ID — get available IDs from list_workspaces()
Returns items and a cursor for the next page (null if no more pages).
get_category_by_slugsA

Get category details by hub profile username, channel name, and category name slugs.

workspace_id: target workspace ID — get available IDs from list_workspaces()
create_sectionA

Create a new section inside a channel category. Returns the new section ID.

workspace_id: target workspace ID — get available IDs from list_workspaces()
update_sectionB

Rename a section inside a channel category.

workspace_id: target workspace ID — get available IDs from list_workspaces()
delete_sectionA

Permanently delete a section from a channel category. Irreversible.

workspace_id: target workspace ID — get available IDs from list_workspaces()
add_content_to_categoryC

Add one or more content items to a section inside a channel category.

workspace_id: target workspace ID — get available IDs from list_workspaces()
list_contentsA

List content items in a hub profile with cursor-based pagination.

workspace_id: target workspace ID — get available IDs from list_workspaces()
types: ["Content"], ["Collection"], or None for both (default)
Returns {"items": [...], "cursor": "..." | null}
search_contentsA

Search content items in a hub profile by keyword.

workspace_id: target workspace ID — get available IDs from list_workspaces()
search: REQUIRED non-empty keyword. An empty/blank string is rejected (400);
    there is no "list all" via search — to browse, walk channels/categories.
types: ["Content"], ["Collection"], or None for both (default)
get_contentB

Get content item details by ID (v1 schema).

workspace_id: target workspace ID — get available IDs from list_workspaces()
hub_profile_id: optional, used to resolve access context
get_content_v2A

Get content item by ID (v2 schema).

workspace_id: target workspace ID — get available IDs from list_workspaces()
Includes main asset, user progression, and extended metadata.
create_contentA

Create a new content item in a hub profile.

workspace_id: target workspace ID — get available IDs from list_workspaces()
privacy: "Preview" (default), "Private", or "Public"
channels: list of channel IDs. NOTE: a channel placement needs a category,
    so passing channels alone here often does NOT stick (saved channels:[]).
    To reliably place content, call add_content_to_categories(content_id,
    channel_id, category_ids=[...]) after create.
main_asset_id: ID of the primary playable asset
url: optional external URL to associate with the content
cover_image: http(s):// URL (or local path) of the cover; the URL PATH must
    end in an image extension (.jpg/.png/...). Query strings are fine (signed
    URLs work); an extension-less URL (e.g. placehold.co/600x400) returns 400.
categories: category assignment objects

context: the body — an ordered list of widget objects. Each widget MUST
carry a "$type" discriminator (literal key, with the dollar sign). Keys are
camelCase: the backend rejects snake_case for multi-word fields (assetId,
hubProfileIds, referenceIds) as a silent 400, so never send asset_id etc.
Shapes:
  • Text (markdown body):
    {"$type": "Text", "content": "<markdown, required>", "title": "<optional>"}
  • LinkList:
    {"$type": "LinkList", "title": "<optional>", "links": [
        {"$type": "CustomLink", "title": "<required, unique in list>", "url": "https://...", "extension": "<optional image ext>"},
        {"$type": "KnownLink",  "title": "<required>", "url": "https://..."}
    ]}
    (both link types use "title" + "url"; NOT "label"/"type". Max 20 links.)
  • Media: {"$type": "Media", "assetId": "<existing PLAYABLE/video asset id>", "autoplay": false, "title": "<optional>"}
    (assetId must be an EXISTING playable/video asset of the hub; an image or
    a just-uploaded asset is NOT playable media and returns 404. No image-body
    widget exists — use the cover, a CustomLink, or markdown in a Text widget.)
  • HubProfile: {"$type": "HubProfile", "hubProfileIds": ["<hub id>", ...], "title": "<optional>"}
    (hubProfileIds is a REQUIRED array, even for a single hub)
  • ContentWidget: {"$type": "ContentWidget", "referenceType": "Content",
        "referenceIds": [{"$type": "Content", "id": "<content id>"}], "title": "<optional>"}
    (each reference is {"$type": "Content"|"Asset", "id": "..."}; referenceType matches the kind)
A single bad widget rejects the WHOLE call with 400 (the error now names the
rejected field). Widget title (when set) is 1-150 chars.
update_contentA

Update a content item's metadata. Only provided fields are changed.

workspace_id: target workspace ID — get available IDs from list_workspaces()
privacy: "Preview", "Private", or "Public"
channels: list of channel IDs (replaces existing placement)
main_asset_id: ID of the primary playable asset
url: external URL to associate with the content
hub_profile_id: the owning hub profile. Optional — when omitted it is
    resolved automatically from the content, so you normally do not pass it.
cover_image: http(s):// URL (or local path) of the cover; the URL PATH must
    end in an image extension (.jpg/.png/...). Query strings are fine (signed
    URLs work); an extension-less URL (e.g. placehold.co/600x400) returns 400.
categories: category assignment objects (REPLACES existing — to append,
    read the content first and send the full list back)

context: the body — REPLACES the existing widget list. Same widget shapes
as create_content, camelCase keys: "Text"{content}; "LinkList"{links:[{$type,
title,url}]}; "Media"{assetId,autoplay}; "HubProfile"{hubProfileIds:[...]};
"ContentWidget"{referenceType,referenceIds:[{$type,id}]}. To append to the
current body, read it first (get_content_v2) and send the existing widgets
plus the new ones.
archive_contentA

Archive a content item (hidden from listings, fully reversible).

The platform has no hard delete for content — archiving is how you remove
a content item from view; use restore_content to bring it back.
workspace_id: target workspace ID — get available IDs from list_workspaces()
restore_contentA

Restore a previously archived content item.

workspace_id: target workspace ID — get available IDs from list_workspaces()
add_content_to_categoriesA

Add a content item to one or more channel categories.

workspace_id: target workspace ID — get available IDs from list_workspaces()
content_id:   ID of the content item
channel_id:   ID of the channel
category_ids: IDs of the categories inside that channel to add the content to
remove_content_from_categoriesA

Remove a content item from one or more channel categories.

The content item itself is not deleted.
workspace_id: target workspace ID — get available IDs from list_workspaces()
content_id:   ID of the content item
channel_id:   ID of the channel
category_ids: IDs of the categories to remove the content from
move_contentA

Move a content item to a different category section within a channel.

workspace_id: target workspace ID — get available IDs from list_workspaces()
content_id:  ID of the content item to move
channel_id:  ID of the channel containing the target category
category_id: ID of the destination category
section_id:  ID of the destination section within that category
create_content_sectionB

Create a section inside a collection content item's category.

workspace_id: target workspace ID — get available IDs from list_workspaces()
category_name: the name slug of the category (e.g. "week-1")
update_content_sectionB

Rename a section inside a collection content item's category.

workspace_id: target workspace ID — get available IDs from list_workspaces()
delete_content_sectionC

Delete a section from a collection content item's category. Irreversible.

workspace_id: target workspace ID — get available IDs from list_workspaces()
add_subcontentA

Link existing content items as subcontent inside a collection section.

Subcontent is the nested content that lives inside a Collection — think
lessons inside a course, or chapters inside a module.  A Content item
automatically becomes a Collection once it has at least one subcontent item.

workspace_id: target workspace ID — get available IDs from list_workspaces()
content_id:     ID of the collection (the parent content item)
category_name:  "Content" for nested content items, "Asset" for nested assets
section_id:     ID of the section to add the subcontent into
                (create a section first with create_content_section if needed)
subcontent_ids: list of content IDs to link as subcontent (one or more)
get_subcontentA

List the subcontent items nested inside a collection, page by page.

Returns the content items linked as subcontent inside the given collection's
category.  Each item includes its id, name, cover, privacy, progression,
and the section it belongs to.

workspace_id: target workspace ID — get available IDs from list_workspaces()
content_id:    ID of the collection (the parent content item)
category_name: "Content" (nested content items) or "Asset" (nested assets)
page_size:     items per page (default 50)
cursor:        opaque cursor from a previous response; omit for first page
order:         "Asc" (default) or "Desc"

Returns {"items": [...], "cursor": "..." | null}
delete_subcontentA

Unlink a subcontent item from a collection section.

Removes the link between the collection and the subcontent item.  The
subcontent item itself is NOT deleted — it continues to exist as a
standalone content item.

workspace_id: target workspace ID — get available IDs from list_workspaces()
content_id:    ID of the collection (the parent content item)
category_name: "Content" or "Asset"
section_id:    ID of the section that currently contains the subcontent item
subcontent_id: ID of the subcontent item to unlink
move_subcontentA

Reorder a subcontent item within a collection section.

Moves the item to the position immediately AFTER previous_subcontent_id.
Pass previous_subcontent_id=None to move the item to the very first
position in the section.

workspace_id: target workspace ID — get available IDs from list_workspaces()
content_id:             ID of the collection (the parent content item)
category_name:          "Content" or "Asset"
section_id:             ID of the section containing the subcontent item
subcontent_id:          ID of the subcontent item to reorder
previous_subcontent_id: ID of the item that should come directly before the
                        moved item; None places it first in the section
patch_content_progressionA

Update the current user's progression status for a content item.

workspace_id: target workspace ID — get available IDs from list_workspaces()
status: "NotStarted", "Incomplete", or "Completed"
patch_media_progressionA

Update the current user's last watched position in a media asset (seconds).

workspace_id: target workspace ID — get available IDs from list_workspaces()
Call periodically during playback to enable resume functionality.
get_progression_statsA

Get completion statistics for the current user.

workspace_id: target workspace ID — get available IDs from list_workspaces()
Pass collection_id to scope to a specific collection.
Returns total content count and how many the user has completed.
list_assetsA

List assets in a hub profile with cursor-based pagination.

workspace_id: target workspace ID — get available IDs from list_workspaces()
types: e.g. ["Media", "File", "Image", "Embed", "Video"] or None for all
Returns {"items": [...], "cursor": "..." | null}
search_assetsA

Search assets in a hub profile by keyword.

workspace_id: target workspace ID — get available IDs from list_workspaces()
types: e.g. ["Media", "File"] or None for all types
get_assetA

Get full asset details by ID (Media, File, Image, Embed, or Video).

workspace_id: target workspace ID — get available IDs from list_workspaces()
update_assetA

Update an asset's display name, read-only flag, and optionally its cover image.

workspace_id: target workspace ID — get available IDs from list_workspaces()
cover_image: local file path or http(s):// URL — SDK uploads automatically.
create_embed_assetB

Create an embed asset (external URL embed) in a hub profile.

workspace_id: target workspace ID — get available IDs from list_workspaces()
create_media_assetA

Create a media (video) asset record in a hub profile.

DEPRECATED: registers a record only and does not upload bytes; the
current backend requires a multipart upload init, so this call fails.
Use `upload_asset` to create and upload in one step.

workspace_id: target workspace ID — get available IDs from list_workspaces()
Returns a signed URL for uploading the actual video file.
create_file_assetA

Create a file asset record in a hub profile.

DEPRECATED: registers a record only and does not upload bytes; the
current backend requires a multipart upload init, so this call fails.
Use `upload_asset` to create and upload in one step.

workspace_id: target workspace ID — get available IDs from list_workspaces()
extension: without dot, e.g. "pdf"
Returns a signed URL for uploading the actual file.
create_image_assetA

Create an image asset record in a hub profile.

DEPRECATED: registers a record only and does not upload bytes; the
current backend requires a multipart upload init, so this call fails.
Use `upload_asset` to create and upload in one step.

workspace_id: target workspace ID — get available IDs from list_workspaces()
extension: without dot, e.g. "png"
Returns a signed URL for uploading the actual image.
create_video_assetA

Create a video file asset record in a hub profile.

DEPRECATED: registers a record only and does not upload bytes; the
current backend requires a multipart upload init, so this call fails.
Use `upload_asset` to create and upload in one step.

workspace_id: target workspace ID — get available IDs from list_workspaces()
extension: without dot, e.g. "mp4"
Returns a signed URL for uploading the actual video file.
upload_assetA

Create an asset AND upload its bytes in one call.

This is the real upload path: it runs the full multipart flow
(init -> PUT parts -> finalize) and returns a ready, downloadable asset.
Prefer this over the deprecated create_*_asset tools, which only
register an empty record and fail against the current backend.

Provide the file via exactly one of:
  - source_url: an http(s):// URL the server downloads, or
  - base64_content: base64-encoded bytes (best for small files).

workspace_id: target workspace ID — get available IDs from list_workspaces()
extension: file extension without the dot (e.g. "pdf", "png", "mp4").
    Inferred from source_url or name when omitted.
asset_type: "Image", "Video", or "File". Auto-detected from the extension
    when omitted.
width / height: image dimensions in pixels. Auto-detected from the file
    header for common image formats; pass explicitly otherwise.
media_type: optional mediaType integer for Video uploads.
get_workspace_usersA

List all users in a workspace with their roles.

workspace_id: target workspace ID — get available IDs from list_workspaces()
get_userC

Get a user's full profile by ID.

workspace_id: target workspace ID — get available IDs from list_workspaces()
check_user_exists_by_emailA

Check whether a user account with the given email address exists.

workspace_id: target workspace ID — get available IDs from list_workspaces()
check_user_exists_by_phoneA

Check whether a user account with the given phone number exists (e.g. "+1234567890").

workspace_id: target workspace ID — get available IDs from list_workspaces()
list_invitationsC

List all pending invitations for a hub profile.

workspace_id: target workspace ID — get available IDs from list_workspaces()
invite_to_hub_profileC

Send email invitations to join a hub profile.

workspace_id: target workspace ID — get available IDs from list_workspaces()
role_id: 1 = Admin, 2 = Editor, 3 = Viewer
invite_to_workspaceA

Send email invitations to join a workspace.

workspace_id: target workspace ID — get available IDs from list_workspaces()
role_id: 1 = Admin, 2 = Editor, 3 = Viewer
get_invitation_linkC

Generate a shareable invitation link for a single email address.

workspace_id: target workspace ID — get available IDs from list_workspaces()
role_id: 1 = Admin, 2 = Editor, 3 = Viewer
Returns the invitation ID and access link URL.
update_invitationB

Update the role assigned to a pending invitation.

workspace_id: target workspace ID — get available IDs from list_workspaces()
role_id: 1 = Admin, 2 = Editor, 3 = Viewer
delete_invitationB

Cancel and permanently delete a pending invitation.

workspace_id: target workspace ID — get available IDs from list_workspaces()
list_workspace_invitationsA

List all pending invitations for a workspace.

workspace_id: target workspace ID — get available IDs from list_workspaces()
get_workspace_invitation_linkA

Generate a shareable invitation link for a workspace for a single email.

workspace_id: target workspace ID — get available IDs from list_workspaces()
role_id: 1 = Admin, 2 = Editor, 3 = Viewer
Returns the invitation ID and access link URL.
update_workspace_invitationA

Update the role assigned to a pending workspace invitation.

workspace_id: target workspace ID — get available IDs from list_workspaces()
role_id: 1 = Admin, 2 = Editor, 3 = Viewer
delete_workspace_invitationA

Cancel and permanently delete a pending workspace invitation.

workspace_id: target workspace ID — get available IDs from list_workspaces()
can_readA

Check whether the current user has read access to a target.

workspace_id: target workspace ID — get available IDs from list_workspaces()
target_type: "HubProfile", "Workspace", "Channel", "Content", etc.
can_editC

Check whether the current user has edit access to a target.

workspace_id: target workspace ID — get available IDs from list_workspaces()
target_type: "HubProfile", "Workspace", "Channel", "Content", etc.
can_create_childA

Check whether the current user can create a child resource inside a parent.

workspace_id: target workspace ID — get available IDs from list_workspaces()
Example: can the user create a "Channel" inside a "HubProfile"?
can_manage_permissionsC

Check whether the current user can grant/revoke roles on a target.

workspace_id: target workspace ID — get available IDs from list_workspaces()
can_archiveB

Check whether the current user can archive a target.

workspace_id: target workspace ID — get available IDs from list_workspaces()
is_memberC

Check whether the current user is a member of a target (any role).

workspace_id: target workspace ID — get available IDs from list_workspaces()
get_permission_targetsA

Get all targets of a given type accessible to the current user.

workspace_id: target workspace ID — get available IDs from list_workspaces()
target_type: "HubProfile", "Workspace", "Channel", etc.
child_target_type: filter to targets that have a child of this type
parent_target_id: filter to targets belonging to this parent
Returns each target with its permission flags (can_edit, can_archive, etc.)
give_permissionA

Grant a user a role on a target (hub profile, workspace, channel, etc.).

workspace_id: target workspace ID — get available IDs from list_workspaces()
target_type: "HubProfile", "Workspace", or "Channel"
role_id: 1 = Admin, 2 = Editor, 3 = Viewer
delete_permissionA

Revoke all permissions a user has on a target.

workspace_id: target workspace ID — get available IDs from list_workspaces()
target_type: "HubProfile", "Workspace", or "Channel"
list_workspacesA

List all workspaces accessible with the current API key(s).

Returns a SLIM row per workspace — id and name — which is all you need to
pick a workspace_id for other tools. For full details (seats, subscription,
hub profiles) call get_workspace(workspace_id); for a workspace's brands
call list_hub_profiles(workspace_id).

A user-level key (srgplus_u_) returns every workspace it can reach; multiple
keys are merged. The list comes from the single bulk call made when the key
was resolved, so it is one response, not one request per workspace.
get_workspaceA

Get full details of a workspace (name, seats, subscription, hub profiles).

workspace_id: target workspace ID — get available IDs from list_workspaces()
update_workspaceA

Update a workspace's display name.

workspace_id: target workspace ID — get available IDs from list_workspaces()
get_workspace_hub_profilesB

List all hub profiles in a workspace (minimal representation).

workspace_id: target workspace ID — get available IDs from list_workspaces()
list_workspace_actionsA

List all automation actions configured on a workspace.

workspace_id: target workspace ID — get available IDs from list_workspaces()
get_workspace_actionA

Get full details of a workspace automation action by ID.

workspace_id: target workspace ID — get available IDs from list_workspaces()
create_workspace_actionB

Create a workspace automation action. Returns the new action ID.

workspace_id: target workspace ID — get available IDs from list_workspaces()
metadata example for a webhook trigger:
  {"$type": "ProgressionUpdatedMetadata", "webhookUrl": "https://..."}
hub_profile_ids: profiles this action applies to (default: all)
update_workspace_actionA

Update a workspace automation action. All fields are overwritten.

workspace_id: target workspace ID — get available IDs from list_workspaces()
metadata example: {"$type": "ProgressionUpdatedMetadata", "webhookUrl": "https://..."}
delete_workspace_actionA

Permanently delete a workspace automation action.

workspace_id: target workspace ID — get available IDs from list_workspaces()
list_permission_groupsA

List all permission groups for a target.

workspace_id: target workspace ID — get available IDs from list_workspaces()
target_type: "HubProfile" or "Workspace"
get_permission_groupA

Get a permission group by ID, including its members.

workspace_id: target workspace ID — get available IDs from list_workspaces()
create_permission_groupB

Create a new permission group on a target. Returns the new group ID.

workspace_id: target workspace ID — get available IDs from list_workspaces()
target_type: "HubProfile" or "Workspace"
update_permission_groupB

Rename a permission group.

workspace_id: target workspace ID — get available IDs from list_workspaces()
delete_permission_groupA

Permanently delete a permission group. Members lose inherited permissions.

workspace_id: target workspace ID — get available IDs from list_workspaces()
add_users_to_permission_groupB

Add one or more users to a permission group.

workspace_id: target workspace ID — get available IDs from list_workspaces()
remove_user_from_permission_groupC

Remove a user from a permission group.

workspace_id: target workspace ID — get available IDs from list_workspaces()
get_srgplus_guideA

Return the full SRG+ how-to guide: navigation, content creation, the exact widget shapes for the context body, safe-update rules, asset upload, archive/restore, and common pitfalls.

Call this once before authoring or editing content if you are unsure of the
workflow or a widget's shape — it is the authoritative reference and ships
with the connector (no separate skill install needed).

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

B3.4/5.0

Scored across 103 tools

Disambiguation4/5

Most tools have distinct purposes, but the high number of similar CRUD operations (e.g., create_hub_profile vs create_channel vs create_category, get_channel_by_name vs get_channel) could cause confusion. The descriptions are detailed enough to differentiate, though some overlap exists between content/category/section operations.

Naming Consistency4/5

The naming convention is mostly consistent with verb_noun patterns (list_, get_, create_, update_, delete_, etc.), but there are some deviations like `can_read`, `can_edit`, `is_member`, and `get_srgplus_guide` that don't fit the typical CRUD pattern. The mix of `list_*` and `get_*` for similar operations is slightly inconsistent.

Tool Count2/5

With 103 tools, this is a very large surface area. While the domain is broad (workspaces, hub profiles, channels, categories, sections, content, assets, users, permissions, invitations, automation actions), the sheer number makes navigation difficult. Many tools are near-duplicates (e.g., multiple invitation link generators, multiple permission checkers), suggesting the count could be trimmed.

Completeness5/5

The tool set appears to cover the full lifecycle of the platform: workspace management, hub profile management, content hierarchy (channel→category→section→content), asset upload, user/permission management, invitations, automation actions, and permission groups. Missing features like content deletion are intentional (archiving instead), and the guide tool fills knowledge gaps.

Maintenance

ActivityInactive
ResponsivenessNo issues