Community (opt-in)

Tag groups

Search Tag Groups

read-onlyidempotentopen-world
discourse_search_tag_groups

Public visibility-filtered tag-group search. q and names combine with AND semantics; upstream treats % and _ in q as SQL LIKE wildcards. Results intentionally omit group IDs, parent tags, and permissions and are not authoritative staff inventory. Exact case-insensitive group name is the supported correlation key. Always sends an explicit limit and reports possible truncation.

Parameters

qstring
namesArray<string>
limitinteger[1, 1000]100

Returns

resultsArray<object>required
Show child attributes
namestringrequired
tagsArray<object>required
Show child attributes
idintegerrequired
namestringrequired
slugstringrequired
metaobjectrequired
Show child attributes
limitinteger[1, 1000]required
returnedinteger>= 0required
truncatedbooleanrequired

List Tag Groups

read-onlyidempotentopen-world
discourse_list_tag_groups

Authoritative unpaginated tag-group inventory ordered by name. Requires a locally configured API credential and upstream staff authority; Discourse returns a privacy-preserving 404 to non-staff. Staff reads can work when tagging is disabled. Returns canonical tags, parent, one-per-topic, explicit permissions entries ({group_id, access}; group_id 0 is everyone), and optimistic state hashes.

Returns

tag_groupsArray<object>required
Show child attributes
idintegerrequired
namestringrequired
tagsArray<object>required
Show child attributes
idintegerrequired
namestringrequired
slugstringrequired
parent_tagobject | nullrequired
Show child attributes
Any of
idintegerrequired
namestringrequired
slugstringrequired
null
one_per_topicbooleanrequired
permissionsArray<object>required

Complete tag-group permission list. Use [{"group_id":0,"access":"full"}] for everyone with full access.

Show child attributes
group_idinteger>= 0required

Numeric Discourse group ID. Use 0 for the built-in everyone group.

accessstringfullreadonlyrequired

Tag permission for this group: full allows use; readonly allows visibility without use.

state_hashstringrequired

Get Tag Group

read-onlyidempotentopen-world
discourse_get_tag_group

Get authoritative tag-group state by ID. Requires a locally configured API credential and upstream staff authority. The deterministic state_hash is an MCP optimistic precondition, not an upstream atomic lock; a race remains possible after preflight.

Parameters

idintegerrequired

Returns

tag_groupobjectrequired
Show child attributes
idintegerrequired
namestringrequired
tagsArray<object>required
Show child attributes
idintegerrequired
namestringrequired
slugstringrequired
parent_tagobject | nullrequired
Show child attributes
Any of
idintegerrequired
namestringrequired
slugstringrequired
null
one_per_topicbooleanrequired
permissionsArray<object>required

Complete tag-group permission list. Use [{"group_id":0,"access":"full"}] for everyone with full access.

Show child attributes
group_idinteger>= 0required

Numeric Discourse group ID. Use 0 for the built-in everyone group.

accessstringfullreadonlyrequired

Tag permission for this group: full allows use; readonly allows visibility without use.

state_hashstringrequired
warningsArray<string>

Create Tag Group

open-world
discourse_create_tag_group

Create a tag group with an explicit complete permission list such as permissions: [{group_id: 0, access: "full"}] for everyone, nonempty members, an optional parent selector, and one-per-topic policy. Omit parent_tag or use null when there is no parent; blank placeholders are safely treated as omitted. New tag names require allow_tag_creation=true because they create persistent tags and trigger normal indexing/plugin hooks. Duplicate-name and ID checks are advisory; upstream staff authority, tagging_enabled, and constraints remain authoritative.

Body

application/json
namestringrequired
tagsArray<object>required
Show child attributes
Any of
idintegerrequired
namestringrequired
parent_tagobject | null

Optional parent tag selector. Omit or use null when there is no parent; blank string placeholders are treated as omitted.

Show child attributes
Any of
Any of
idintegerrequired
namestringrequired
null
one_per_topicbooleanfalse
permissionsArray<object>required

Complete tag-group permission list. Use [{"group_id":0,"access":"full"}] for everyone with full access.

Show child attributes
group_idinteger>= 0required

Numeric Discourse group ID. Use 0 for the built-in everyone group.

accessstringfullreadonlyrequired

Tag permission for this group: full allows use; readonly allows visibility without use.

allow_tag_creationbooleanfalse

Returns

tag_groupobjectrequired
Show child attributes
idintegerrequired
namestringrequired
tagsArray<object>required
Show child attributes
idintegerrequired
namestringrequired
slugstringrequired
parent_tagobject | nullrequired
Show child attributes
Any of
idintegerrequired
namestringrequired
slugstringrequired
null
one_per_topicbooleanrequired
permissionsArray<object>required

Complete tag-group permission list. Use [{"group_id":0,"access":"full"}] for everyone with full access.

Show child attributes
group_idinteger>= 0required

Numeric Discourse group ID. Use 0 for the built-in everyone group.

accessstringfullreadonlyrequired

Tag permission for this group: full allows use; readonly allows visibility without use.

state_hashstringrequired
warningsArray<string>

Update Tag Group

destructiveopen-world
discourse_update_tag_group

Safely replace complete tag-group state after a fresh expected_state_hash preflight. Omitted mutable fields are preserved locally, but Discourse receives full tags, parent, one-per-topic, and permissions because partial upstream bodies clear state. For parent_tag, omit or pass a blank placeholder to preserve the current parent; pass null to clear it. Permissions use explicit {group_id, access} entries; group_id 0 means everyone. Tag/parent removals, permission replacement, and possible materialization of serializer-synthesized everyone/full permissions require explicit acknowledgements. The hash is advisory rather than an upstream atomic lock; uncertain post-dispatch outcomes must not be retried blindly.

Body

application/json
idintegerrequired
expected_state_hashstringrequired
namestring
tagsArray<object>
Show child attributes
Any of
idintegerrequired
namestringrequired
parent_tagobject | null

Optional parent tag selector. Omit or use null when there is no parent; blank string placeholders are treated as omitted.

Show child attributes
Any of
Any of
idintegerrequired
namestringrequired
null
one_per_topicboolean
permissionsArray<object>

Complete tag-group permission list. Use [{"group_id":0,"access":"full"}] for everyone with full access.

Show child attributes
group_idinteger>= 0required

Numeric Discourse group ID. Use 0 for the built-in everyone group.

accessstringfullreadonlyrequired

Tag permission for this group: full allows use; readonly allows visibility without use.

allow_tag_creationbooleanfalse
confirm_tag_removalbooleanfalse
confirm_parent_removalbooleanfalse
confirm_permission_replacementbooleanfalse
acknowledge_possible_synthetic_permission_materializationbooleanfalse

Returns

tag_groupobjectrequired
Show child attributes
idintegerrequired
namestringrequired
tagsArray<object>required
Show child attributes
idintegerrequired
namestringrequired
slugstringrequired
parent_tagobject | nullrequired
Show child attributes
Any of
idintegerrequired
namestringrequired
slugstringrequired
null
one_per_topicbooleanrequired
permissionsArray<object>required

Complete tag-group permission list. Use [{"group_id":0,"access":"full"}] for everyone with full access.

Show child attributes
group_idinteger>= 0required

Numeric Discourse group ID. Use 0 for the built-in everyone group.

accessstringfullreadonlyrequired

Tag permission for this group: full allows use; readonly allows visibility without use.

state_hashstringrequired
warningsArray<string>

Delete Tag Group

destructiveopen-world
discourse_delete_tag_group

Permanently delete one exact tag group after fresh name/state-hash checks and explicit acknowledgements for category relationship cascades and unresolved plugin dependencies. Deletion removes memberships, permissions, and category allowed/required relationships, but not tags or topic-tag rows. Dependency discovery is not exhaustive (plugins such as RSS polling may depend on groups). Scoped API keys may not include this delete route. A 200 response is only dispatch acknowledgement; absence is verified before success.

Parameters

idintegerrequired
namestringrequired
expected_state_hashstringrequired
confirm_deletebooleanrequired
acknowledge_category_relationship_removalbooleanrequired
acknowledge_unresolved_plugin_dependenciesbooleanrequired

Returns

deletedbooleanrequired
idintegerrequired
namestringrequired
impactobjectrequired
Show child attributes
member_tagsArray<object>required
Show child attributes
idintegerrequired
namestringrequired
slugstringrequired
parent_tagobject | nullrequired
Show child attributes
Any of
idintegerrequired
namestringrequired
slugstringrequired
null
permissionsArray<object>required

Complete tag-group permission list. Use [{"group_id":0,"access":"full"}] for everyone with full access.

Show child attributes
group_idinteger>= 0required

Numeric Discourse group ID. Use 0 for the built-in everyone group.

accessstringfullreadonlyrequired

Tag permission for this group: full allows use; readonly allows visibility without use.

category_relationshipsobjectrequired
Show child attributes
includedbooleanrequired
reasonstringrequired
dependency_discovery_exhaustivebooleanrequired