Skip to main content
Glama

Server Details

Manage uCoz sites from an AI assistant: templates, content, shop, users, and files.

Ownership verified
Status
Healthy
Uptime
85.5% over 42 days
OAuth
Works in Glama
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
ucoz-skills/ucoz-mcp
GitHub Stars
1
Server Listing
ucoz-mcp
ChatGPT
–
Claude
–

TDQS

B3.3/5.0

Scored across 41 tools

Disambiguation4/5

The dominant read/write/delete triad per domain (apps, files, forum, shop, users, templates, etc.) gives each tool a distinct resource+action target, and descriptions explicitly cross-reference neighbours (e.g. ftp_write vs apps_write for FTP accounts, files_read vs apps_read for files). The only real overlap is between the file-manager tools and the server-environment tools, plus ftp vs apps FTP handling, but the descriptions defuse those confusions. An agent can pick correctly in nearly all cases.

Naming Consistency4/5

Almost every tool follows a predictable `<domain>_<action>` pattern with the same three action verbs (read/write/delete), which makes the set very scannable. The deviations are list_sites/create_site/select_site (verb_noun style) and the odd `_tool` suffix on docs_tool and skills_tool, which don't fit the verb pattern. These are minor blemishes rather than a broken convention.

Tool Count3/5

41 tools is well above the comfortable range, but the count is a direct consequence of covering ~13 genuinely separate CMS domains (content, forum, shop, subscriptions, templates, tmaker, users, files, apps, ftp, settings, modules, site management) with a read/write/delete split each. The mechanical triad keeps it navigable, yet each write tool is a mega-tool bundling dozens of operations, so the surface is heavy and coarse rather than well-scoped.

Completeness4/5

Coverage is broad and lifecycle-complete for the major modules: sites can be listed, created and selected; content, forum, shop, subscriptions and users all get read/write/delete; design, templates and server environment are fully supported, plus docs and skills helpers. Gaps are minor but present — no site deletion/transfer, and common uCoz modules like statistics, banners or SEO/webmaster tooling have no surface. Agents can work around these rather than hitting hard dead ends.

Available Tools

41 tools
apps_deleteDelete from server environmentA
Destructive
Inspect

Deletes files, databases and database users, FTP accounts, cron jobs, Node.js and Python apps and keys of the server environment. Cannot be undone.

NameRequiredDescriptionDefault
idNoAlias of key_id.
nameNoDatabase, database user, or FTP user short name. The username_ prefix is added for MySQL.
pathNoFile path relative to the environment home, without the /home/... prefix. Site folders live under domains/{selected_domain} (selected_domain from session, or list domains with files_list path=domains); status.domain is the technical account domain and may not be the folder you need.
userNoFTP username without @domain.
pathsNoHome-relative paths for delete or chmod.
trashNoMove to trash instead of deleting.
actionYesOperation to run. Each oneOf entry describes one action and lists its parameters.
dbuserNoMySQL user. Prefixed with {username}_ when missing.
domainNoEnvironment domain for an app, FTP account, or backup form. Defaults to selected_domain, not a file path.
key_idNoLogin key id. Defaults to main on create. Letters and digits only.
paramsNoExtra selector parameters. PHP extension changes were rejected on the uCoz test environment.
pluginNoLanguage selector plugin: phpselector, nodejs_selector, python_selector.
sourceNoHome-relative source path.
confirmYesPass true only after the user approves this change. Required by: node_destroy, python_destroy, selector_destroy, files_delete, db_delete, db_delete_user, ftp_delete, cron_delete, login_key_delete, da_login_key_delete, visitor_key_delete.
cron_idNoId of a cron job: jobs[].id of cron_list, such as 000.
select0NoFTP account to delete: the short username from ftp_list. user@domain is accepted and the domain part is dropped. Also an alias of cron_id.
sourcesNoHome-relative paths for copy-to, move-to, or create-archive.
app_rootNoApplication directory relative to home, or /home/{username}/....
cron_idsNoIds of several cron jobs to delete (jobs[].id of cron_list).
databaseNoMySQL database. Prefixed with {username}_ when missing.
interpreterNoSelector interpreter: php, nodejs, or python.

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true, but the description adds the important permanence trait ('Cannot be undone') and the breadth of destruction targets, which is real context beyond a generic destructive flag. It stops short of describing the confirm/user-approval gate or any permission requirements, which live only in the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the resource scope and closed with the irreversible-outcome warning. No filler, nothing repeated from the name/title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 21-parameter, multi-action destructive tool, the description establishes purpose and irreversibility but omits the operational workflow: that an action is required to select the deletion type, that confirm must only be passed after user approval, and that ids should come from listing tools. With a fully documented schema these gaps are partly absorbed, but the description alone would leave an agent underspecified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and each action's oneOf entry already lists required and optional parameters, so the schema does the parameter work. The description only implies a mapping between listed resource types and the action enum, adding no syntax or format detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb (deletes) and enumerates the exact resource families covered: files, databases, database users, FTP accounts, cron jobs, Node.js/Python apps and keys, matching the action enum. It is clear what the tool does, though it doesn't explicitly carve out territory versus overlapping siblings such as files_delete or ftp_delete.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied through the scope phrase 'of the server environment'. There is no statement about when to pick apps_delete over apps_write or the narrower files_delete/ftp_delete/cron-style siblings, and no prerequisites (e.g. gather ids from cron_list/ftp_list first) are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

apps_readRead server environmentB
Read-onlyIdempotent
Inspect

Reads the server environment of the active site: status and usage, files and directories, databases and database users, FTP accounts, cron jobs, Node.js, Python and PHP settings, backups, and key records.

NameRequiredDescriptionDefault
idNoAlias of key_id.
nameNoDatabase, database user, or FTP user short name. The username_ prefix is added for MySQL.
pageNoList page, from 1.
pathNoFile path relative to the environment home, without the /home/... prefix. Site folders live under domains/{selected_domain} (selected_domain from session, or list domains with files_list path=domains); status.domain is the technical account domain and may not be the folder you need.
limitNofiles_*: the earlier name of per_page; per_page wins when both are set. files_tree: entries of the tree.
queryNoFile name query (files_search).
actionYesOperation to run. Each oneOf entry describes one action and lists its parameters.
dbuserNoMySQL user. Prefixed with {username}_ when missing.
detailNoRecord form of a paged list. brief (default): for files name, folder, type, size, modification time (UTC, ISO 8601) and symlink flag; for other lists the records as they are. Titles and excerpts are plain text; names, logins, paths, URLs and other identifiers are as the source gives them. full: complete records. A list reply is at most 30 KB and holds every record of its page: a record that does not fit in full comes in brief form, marked detail brief, the reply counts such records in brief_records, and get by id returns the complete record; brief records shorten their excerpts, then keep only their ids and titles. Only a page that does not fit even so is cut: truncated is true and next names the offset to go on from.
domainNoEnvironment domain for an app, FTP account, or backup form. Defaults to selected_domain, not a file path.
key_idNoLogin key id. Defaults to main on create. Letters and digits only.
offsetNoRecords to skip from the start of a list; overrides page. A list reply cut at its size limit names the offset that follows in next.
paramsNoExtra selector parameters. PHP extension changes were rejected on the uCoz test environment.
pluginNoLanguage selector plugin: phpselector, nodejs_selector, python_selector.
databaseNoMySQL database. Prefixed with {username}_ when missing.
per_pageNoRecords per page: 1-50, 20 by default, larger values count as 50.
interpreterNoSelector interpreter: php, nodejs, or python.

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so safety behavior is covered. The description adds scope ("active site") and lists covered resource categories, but does not disclose prerequisites, pagination behavior, or output characteristics beyond what the schema's action descriptions provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence that efficiently states the tool's scope. The long enumeration is justified by the tool's breadth, though it could have used that space to clarify routing among overlapping siblings.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is highly complex with 32 actions and 17 parameters, and the schema is very rich. The description provides an adequate broad overview but does not explain how to choose among actions, how to interpret results, or how this tool relates to overlapping read-only siblings. It relies almost entirely on the schema for completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the action enum's oneOf entries document each operation's parameters and return behavior in detail. The top-level description adds only a broad resource list and no parameter-level meaning beyond the schema, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ("Reads") and resource ("server environment of the active site") and enumerates the data categories covered. It is clear what the tool does, but it does not explicitly distinguish itself from read-oriented siblings such as files_read or settings_read.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no explicit guidance on when to use this tool versus alternatives. This is especially problematic because sibling tools like files_read and settings_read overlap with actions exposed here (files_read, php_get, etc.), and the definition does not explain whether to use apps_read or the dedicated sibling.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

apps_writeChange server environmentB
Destructive
Inspect

Creates and changes the server environment of the active site: activates it, writes, patches, copies, moves and archives files, publishes files for download, manages databases and database users, FTP accounts, cron jobs, Node.js and Python apps, PHP version, backups and keys (without returning key values), and issues one-time phpMyAdmin links.

NameRequiredDescriptionDefault
idNoAlias of key_id.
hourNoCron hour. Default *.
nameNoDatabase, database user, or FTP user short name. The username_ prefix is added for MySQL.
pathNoFile path relative to the environment home, without the /home/... prefix. Site folders live under domains/{selected_domain} (selected_domain from session, or list domains with files_list path=domains); status.domain is the technical account domain and may not be the folder you need.
permNoPermission bits as a number, for example 644.
userNoFTP username without @domain.
hostsNoMySQL host patterns.
mergeNomergeAndOverwrite for copy-to, move-to, and extract.
monthNoCron month. Default *.
partsNoBackup components: domain, database, ftp, email, subdomain. Default domain.
pathsNoHome-relative paths for delete or chmod.
actionYesOperation to run. Each oneOf entry describes one action and lists its parameters.
dbuserNoMySQL user. Prefixed with {username}_ when missing.
domainNoEnvironment domain for an app, FTP account, or backup form. Defaults to selected_domain, not a file path.
key_idNoLogin key id. Defaults to main on create. Letters and digits only.
minuteNoCron minute. Default 0.
paramsNoExtra selector parameters. PHP extension changes were rejected on the uCoz test environment.
pluginNoLanguage selector plugin: phpselector, nodejs_selector, python_selector.
sourceNoHome-relative source path.
app_uriNoPublic path. /hello is served as https://{site}/apps/hello.
charsetNoMySQL charset.
commandNoCron shell command. This path may be absolute /home/{username}/... .
confirmNoPass true only after the user approves this change. Required by: activate, switch_domain, files_legacy_edit, files_move, files_move_to, files_extract, db_change_password, db_change_hosts, db_change_privs, ftp_create, ftp_passwd, backup_create, login_key_rotate, da_login_key_patch, visitor_key_rotate. Required in some cases by: ensure_ready, da_login_key_create (see the action).
contentNoUTF-8 file text for files_write, files_patch, or files_legacy_edit.
membersNoArchive member names. Empty means all.
sourcesNoHome-relative paths for copy-to, move-to, or create-archive.
versionNoPHP version (8.2, 8.3, native), Node version (default 22), or Python version (default 3.11).
app_modeNoNode only: development or production. Default production. Not sent for Python.
app_rootNoApplication directory relative to home, or /home/{username}/....
databaseNoMySQL database. Prefixed with {username}_ when missing.
env_varsNoOptional environment variables for a new Node or Python app.
passwordNoPassword for a new DB user, FTP account, or panel login key; at least 8 characters for FTP and DB users. Omit to let the environment generate a DB password.
collationNoMySQL collation.
dayofweekNoCron day of week. Default *.
overwriteNoOverwrite on write/copy/move. files_write defaults to true.
dayofmonthNoCron day of month. Default *.
new_stringNoReplacement text (files_patch).
old_stringNoText to replace. Must occur once (files_patch).
privilegesNoMySQL privilege map. Defaults to the full set on create.
allow_loginNoThe panel login key may open the panel UI. Defaults to false. confirm is required when true.
destinationNoHome-relative destination path.
entry_pointNoPython WSGI callable inside the startup file, for example application. A value ending in .py is used as startup_file when startup_file is omitted.
interpreterNoSelector interpreter: php, nodejs, or python.
new_passwordNoReplacement database password (at least 8 characters).
startup_fileNoApplication startup file. Node default app.js. Python default passenger_wsgi.py.
deny_commandsNoCommand deny list of a panel login key.
allow_commandsNoCommand allow list of a panel login key (da_login_key_commands lists them).
allow_networksNoNetwork allow list of a panel login key.
destination_dirNoHome-relative destination directory for copy-to, move-to, and extract.
selector_methodNoselector_change method: set, create, start, stop, restart, install-modules.
current_passwordNoCurrent password, only if a panel login key call requires it.

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, readOnlyHint=false and openWorldHint=true, so the safety profile is covered. The description adds real value on two points: login key values are never returned and phpMyAdmin links are one-time. It omits other consequential behavior that isn't in annotations, such as published files landing in public_html and requiring manual cleanup (only visible in the oneOf branch text).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single run-on sentence that front-loads the core purpose, then lists roughly ten capability clusters in a breath. Each cluster is real, but the catalogue is hard to scan and largely restates what the action enum already lists action-by-action.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that the action enum carries per-action requirements and all 51 parameters are fully documented in the schema, the description needs only to frame the tool's domain, which it does. The absence of an output schema is not a problem since the branches describe return values (password_once, download URLs, stored_path).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the oneOf branches enumerate required/optional params per action, so the schema does nearly all the work. The top-level description adds no parameter syntax, defaults, or dispatch hints beyond what the enum already encodes, making the baseline 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource ('Creates and changes the server environment of the active site'), which distinguishes it from apps_read and apps_delete. The enumerated capability list confirms its scope as a broad write surface, though the enumeration is more of a catalogue than a purpose statement.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to pick this tool over alternatives, and the sibling list contains direct competitors whose names mirror its actions (files_write vs. action files_write, ftp_write vs. ftp_create/ftp_passwd). It also never explains that most actions need confirm=true and user approval first, which the schema buries in the confirm property.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

content_deleteDelete contentB
Destructive
Inspect

Deletes entries, categories, comments, filters and video channels from a content module of the active site. Cannot be undone.

NameRequiredDescriptionDefault
idNoRecord, category, comment, or forum entity id.
actionYesOperation to run. Each oneOf entry describes one action and lists its parameters.
moduleYesContent module code. poll is the same module as polls (module and settings lists name it poll). Not used by comments_all. The forum has its own forum_* tools.
confirmYesPass true only after the user approves this change. Required by: delete, category_delete, comments_delete, filter_delete, channel_delete, channel_category_delete.
channel_idNoVideo channel id.
filter_numNoFilter number 1-3.

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is covered structurally. The description's addition of "Cannot be undone" genuinely confirms permanence — information a hint alone doesn't convey — but it stops there: nothing about required permissions, what happens to dependent records (e.g. comments on a deleted entry), or whether the confirm flag can be bypassed programmatically.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no filler, with scope stated first and the irreversibility warning front-loaded at the end where it lands hardest. Nothing repeats the title or the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a six-parameter destructive tool with full schema coverage and no output schema, the description covers what is deleted, from where, and that it's permanent. The remaining gaps — the user-approval gate for confirm, the forum exclusion, and the module/polls alias — are all handled in the schema, so nothing critical is missing, though a one-line cross-reference to content_write would have made it complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the action enum's oneOf entries already spell out per-action required parameters (id vs channel_id vs filter_num). The description adds no format or behavioral detail beyond the resource vocabulary that maps loosely to the action values, so it sits at the baseline rather than adding value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (deletes) plus the exact resource set (entries, categories, comments, filters, video channels) and scopes it to a content module of the active site. An agent immediately knows what this destroys, though the description itself does not differentiate it from the sibling content_write or point to forum_delete for forum content — that distinction only appears in the schema's module field.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to choose this tool over content_write or the module-specific *_delete siblings, and no mention of prerequisites such as selecting a site first. The only directional statement is a consequence ("Cannot be undone"), which warns but does not route.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

content_readRead contentB
Read-onlyIdempotent
Inspect

Reads entries, categories, comments, filters, albums and video channels of a content module (news, blog, publ, board, photo, video, faq, dir, load, gb, stuff, mchat, polls) on the active site.

NameRequiredDescriptionDefault
idNoRecord, category, comment, or forum entity id.
dateNoList filter date yyyy-mm-dd or yyyy.
pageNoList page, from 1.
sortNoList sort asc|desc.
treeNocomments_all: yes tree / no flat.
actionYesOperation to run. Each oneOf entry describes one action and lists its parameters.
detailNoRecord form of a paged list. brief (default): the fields that identify a record, without full texts and HTML; for entries id, title up to 120 characters, status, date added (UTC, ISO 8601), public URL, category id and an excerpt up to 200 characters. Titles and excerpts are plain text; names, logins, paths, URLs and other identifiers are as the source gives them. full: complete records. A list reply is at most 30 KB and holds every record of its page: a record that does not fit in full comes in brief form, marked detail brief, the reply counts such records in brief_records, and get by id returns the complete record; brief records shorten their excerpts, then keep only their ids and titles. Only a page that does not fit even so is cut: truncated is true and next names the offset to go on from.
moduleNoContent module code. poll is the same module as polls (module and settings lists name it poll). Not used by comments_all. The forum has its own forum_* tools.
offsetNoRecords to skip from the start of a list; overrides page. A list reply cut at its size limit names the offset that follows in next.
pendingNo1 = moderation / pending-only list.
user_idNoAct-as user id.
categoryNoCategory id (list filter / add).
per_pageNoRecords per page: 1-50, 20 by default, larger values count as 50.
channel_idNoVideo channel id.
filter_numNoFilter number 1-3.

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered. The description adds only the 'active site' context and the module/resource scope; it says nothing about pagination, truncation, or return behavior beyond what the schema's detail/offset params already document.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with the verb first and no filler. The parenthetical module-code list partly duplicates the schema enum, a minor redundancy, but the sentence remains tight and readable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex 11-action, 15-parameter tool with no output schema, the one-line description is thin on return-value and paging behavior, though the action enum and detail parameter in the schema compensate substantially. Adequate but not fully self-contained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the action enum carries per-action required/optional parameter detail, so the schema does the heavy lifting. The description itself adds no parameter meaning, which is the baseline 3 case when coverage is high.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Reads') and enumerates concrete resources (entries, categories, comments, filters, albums, video channels) plus the supported module codes. It clearly conveys the content-reading scope, but it does not explicitly differentiate itself from the content_write/content_delete siblings, relying on the name instead.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description offers no when-to-use, when-not, or alternative guidance; it is a single scope sentence. Prerequisites (an active site) are only implied by 'on the active site', and the routing hints (e.g. forum_* tools, comments_all needing no module) live in the schema, not the description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

content_writeEdit contentA
Destructive
Inspect

Creates and updates entries, categories, comments, filters and video channels in a content module of the active site, sets entry tags and rates entries. Entries are published to the site.

NameRequiredDescriptionDefault
idNoRecord, category, comment, or forum entity id.
urlNomchat author url field.
wwwNoAuthor website.
markNoGuestbook rating: 1 good, 2 bad.
nameNoCategory, forum, section, or channel name; guestbook author name; author name or contact person of a publ, load, board, dir or stuff entry.
tagsNoComma-separated tags.
emailNoEmail (guestbook / author).
itemsNoFilter values separated by |.
ontopNo1 = pin entry/topic.
titleNoEntry or topic title; FAQ subject.
actionYesOperation to run. Each oneOf entry describes one action and lists its parameters.
activeNopolls update: yes|no.
answerNoFAQ answer.
authorNoLogin (nick) of the entry author.
closedNo1 = create closed topic.
fieldsNoExtra body keys not listed as top-level params.
moduleYesContent module code. poll is the same module as polls (module and settings lists name it poll). Not used by comments_all. The forum has its own forum_* tools.
objectNoVideo embed iframe HTML.
other1NoCustom field 1 (see action=fields).
other2NoCustom field 2.
other3NoCustom field 3.
other4NoCustom field 4.
other5NoCustom field 5.
ownurlNoCustom URL slug or own URL.
ad_typeNoBoard ad type: value id of filter 3 (see filter_list), same as filter3.
answer1Nopolls add: first answer.
answer2Nopolls add: second answer.
answersNoPoll answers (| for forum, comma for site polls).
custom1Nomchat custom field 1.
custom2Nomchat custom field 2.
filter1NoValue id of entry filter 1 (see filter_list); board takes several ids of filters 1-3 separated by commas.
filter2NoValue id of entry filter 2.
filter3NoValue id of entry filter 3 (board: the ad type).
filter4NoValue id of entry filter 4.
filter5NoValue id of entry filter 5.
messageNoFull text (entry, comment, post); the format of an entry text is set by message_type.
pendingNo1 = moderation / pending-only list.
poll_idNoPoll id (forum or site polls).
subjectNoFAQ subject line.
user_idNoAct-as user id.
add_dateNoPublish date yyyy-mm-dd hh:mm.
categoryNoCategory id (list filter / add).
commentsNo1 = allow comments, 0 = deny.
passwordNoClosed forum password.
pollonlyNo1 = poll-only mode.
polltimeNoPoll duration, e.g. "1 week".
positionNoCategory position.
questionNoFAQ question text.
author_idNoAuthor user id.
file_pathNoLocal MCP server path for file/photo/archive upload. Missing files are an error; remote agents must use file_base64, file_upload_id, or file_site_path.
hgu_titleNoSEO slug in module path.
link2siteNoSite link (dir).
parent_idNoParent comment id.
pollmultyNo1 = multi-select poll.
subscribeNo1 = subscribe to comments.
till_dateNoBoard ad end date yyyy-mm-dd hh:mm; 31 days from now when not set.
uplastmodNoUpdate lastmod flag (maps to uplastmod/update_date/update_lastmod).
access2addNoCategory add group ids (comma-separated).
channel_idNoVideo channel id.
cover_pathNoLocal MCP server path for cover upload. Missing files are an error; remote agents must use cover_base64, cover_upload_id, or cover_site_path.
filter_numNoFilter number 1-3.
image_pathNoLocal MCP server path for image (entry file1 or category file). Missing files are an error; remote agents must use image_base64, image_upload_id, or image_site_path.
meta_titleNoMeta title for an entry or a module category.
photo_pathNoLocal MCP server path for photo upload (multipart). Missing files are an error; remote agents must use photo_base64, photo_upload_id, or photo_site_path.
access2pageNoCategory page access group ids.
author_siteNoAuthor website (publ, load, board, dir, stuff).
descriptionNoShort description / FAQ question; its format is set by description_type.
file_base64NoBase64 file body with file_filename (remote upload). Wins over file_upload_id, file_site_path, and file_path.
link2sourceNoSource link (publ).
show_attachNonews, blog: 1 = show the Attachments block (links to the entry images) on the entry page, 0 = hide it. Off for a new entry unless set; an update without it keeps the current value.
archive_pathNoLocal MCP server path for load archive. Missing files are an error; remote agents must use archive_base64, archive_upload_id, or archive_site_path.
author_emailNoAuthor or contact email (publ, load, board, dir, stuff).
author_phoneNoContact phone (board).
cover_base64NoBase64 cover body with cover_filename (remote upload). Wins over cover_upload_id, cover_site_path, and cover_path.
image_base64NoBase64 image body with image_filename (remote upload). Wins over image_upload_id, image_site_path, and image_path.
message_typeNoFormat of message (faq: answer) on add and update: plain escapes the markup, bb turns BB codes into HTML, html keeps the HTML. news and load always keep the HTML; blog, publ, board, dir, stuff and faq keep it only when the user group may use HTML in the module, otherwise the markup is escaped. Without it a non-empty text of these modules is saved as html.
photo_base64NoBase64 photo body with photo_filename (remote upload). Wins over photo_upload_id, photo_site_path, and photo_path.
file_filenameNoFile name for file_base64, with extension.
meta_keywordsNoMeta keywords for an entry or a module category.
archive_base64NoBase64 archive body with archive_filename (remote upload). Wins over archive_upload_id, archive_site_path, and archive_path.
cover_filenameNoFile name for cover_base64, with extension.
file_site_pathNoFile already on the site (img/x.jpg or its full site URL). Wins over file_path.
file_upload_idNoupload_id from upload_direct. Wins over file_site_path and file_path.
image_filenameNoFile name for image_base64, with extension.
photo_filenameNoFile name for photo_base64, with extension.
access2categoryNoCategory view group ids (comma-separated).
cover_site_pathNoFile already on the site (img/x.jpg or its full site URL). Wins over cover_path.
cover_upload_idNoupload_id from upload_direct. Wins over cover_site_path and cover_path.
image_site_pathNoFile already on the site (img/x.jpg or its full site URL). Wins over image_path.
image_upload_idNoupload_id from upload_direct for the first material image (multipart file1). Wins over image_site_path and image_path.
photo_site_pathNoFile already on the site (img/x.jpg or its full site URL). Wins over photo_path.
photo_upload_idNoupload_id from upload_direct. Wins over photo_site_path and photo_path.
screenshot_pathNoLocal MCP server path for load/video screenshot. Missing files are an error; remote agents must use screenshot_base64, screenshot_upload_id, or screenshot_site_path.
archive_filenameNoFile name for archive_base64, with extension.
description_typeNoFormat of description (faq: question); the same as message_type.
image_upload_idsNoComma-separated upload_id values from upload_direct. They fill material image slots file1, file2, and so on, after image_upload_id when that is also set. At most 50.
meta_descriptionNoMeta description for an entry or a module category.
archive_site_pathNoFile already on the site (img/x.jpg or its full site URL). Wins over archive_path.
archive_upload_idNoupload_id from upload_direct. Wins over archive_site_path and archive_path.
screenshot_base64NoBase64 screenshot body with screenshot_filename (remote upload). Wins over screenshot_upload_id, screenshot_site_path, and screenshot_path.
screenshot_filenameNoFile name for screenshot_base64, with extension.
screenshot_site_pathNoFile already on the site (img/x.jpg or its full site URL). Wins over screenshot_path.
screenshot_upload_idNoupload_id from upload_direct. Wins over screenshot_site_path and screenshot_path.

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, openWorldHint=true, and readOnlyHint=false, so the safety profile is largely covered. The description adds that entries are published to the site, but it omits permission requirements, irreversibility, moderation behavior, and upload constraints that appear only in the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no wasted wording and is front-loaded with the main capabilities. The second sentence adds the important publish side effect without repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a complex 103-parameter, multi-action destructive tool, and the description is minimal at the top level. However, the schema's per-action oneOf descriptions document required and optional fields extensively, and annotations cover the safety profile; no output schema means return values need not be explained here.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description broadly maps capabilities to resource types, but with 103 parameters it adds no parameter-level detail beyond the very rich schema and action oneOf descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names specific verbs and resources: creates and updates entries, categories, comments, filters, and video channels, plus tags and rates entries. This clearly distinguishes a write tool from content_read and content_delete, although it does not explicitly name those siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the write verbs and the phrase 'active site,' so an agent can infer this is for mutations. However, the description gives no explicit when-to-use guidance, exclusions, or alternatives such as content_read, content_delete, or forum_write.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_siteCreate siteAInspect

Creates a new uCoz site on the signed-in account at the given address and zone, and makes it the active site.

NameRequiredDescriptionDefault
domYesZone code (not the full hostname). Pass the code before "="; the site URL is https://{addr}.{host}. Available: l = usite.pro; r = ucoz.site; s = ucoz.club; e = ucoz.net; f = ucoz.org; 6 = clan.su; 7 = moy.su; 8 = do.am.
lngNoTwo-letter language code, default en
addrYesSite address (2-15 chars, a-z0-9-)

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds the non-obvious side effect that the new site becomes the active site, which is meaningful state-change context beyond the annotations. It stops short of disclosing failure behavior, uniqueness constraints, or quota limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler. The side effect is placed at the end where it naturally follows the core action, and nothing is redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple 3-parameter creation tool with full schema coverage and annotations, the description covers the action, target, and side effect. It omits the 'lng' parameter and any failure/duplicate-address behavior, but no output schema exists so return values need not be explained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with the 'dom' enum codes fully mapped to hosts and 'addr'/'lng' constraints documented in the schema. The description only restates 'at the given address and zone' without adding format or validation detail, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Uses a specific verb+resource ('Creates a new uCoz site') and states scope (signed-in account) and side effect ('makes it the active site'). An agent can distinguish it from list_sites and select_site purely from the description.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the verb — this is the only site-creation tool among siblings, so no alternative needs naming. However, it gives no prerequisites (auth requirements, whether the address must be free, quota limits) and no explicit when-to-use framing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

docs_tooluAPI documentationA
Read-onlyIdempotent
Inspect

Looks up the uCoz uAPI OpenAPI specifications: lists them, searches them, returns a full specification. Read-only.

NameRequiredDescriptionDefault
urlNoDirect YAML URL for fetch_spec; only https://api.ucoz.net/{module}-openapi.yaml is accepted.
limitNosearch hits limit, 1–20 (default 5).
queryNoSearch string (action=search).
actionYeslist — module catalog and URLs. search — query YAML lines (pass module to scope). fetch_spec — full YAML.
moduleNoSpec code: news, blog, shop, user, templates, mail, …

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, non-destructive, and openWorldHint=false, so the safety profile is fully covered. The trailing "Read-only" merely repeats readOnlyHint and earns no credit. The description adds little behavioral context beyond the schema-documented URL constraint (only https://api.ucoz.net/{module}-openapi.yaml accepted), leaving it at a baseline 3.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler, cleanly ordered purpose-then-capabilities-then-safety. It loses a point only because the closing "Read-only" is redundant against the annotations and could be dropped without loss.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 5-parameter, enum-driven tool with 100% schema coverage and no output schema, the three modes are adequately described and it notes that fetch_spec returns a full specification. It could still say more about the shape/limits of returned specs (e.g. that results are YAML text), but nothing an agent needs to select or invoke it is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents all five parameters including the enum, ranges, and URL format restriction. The description contributes no additional parameter detail (no default hints, no interaction notes between action and module/query), so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Looks up the uCoz uAPI OpenAPI specifications") and enumerates its three modes — list, search, fetch — each mapping directly to an action enum value. No sibling tool provides documentation lookup, so it is trivially distinguished from the *_read/write/delete family.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description describes what the tool does but never states when to reach for it (e.g. before invoking a uAPI method) or any exclusions. Usage is only implied by the action enum in the schema, not spelled out in prose. No alternatives exist among siblings, so the omission is less severe, but explicit guidance is absent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

files_deleteDelete site filesB
Destructive
Inspect

Deletes files and folders from the site file manager. Cannot be undone.

NameRequiredDescriptionDefault
pathNoClean path without edge slashes, passed as a parameter (never as a URL suffix). Empty string is the site root; content_get, content_put and mkdir need a non-empty path. Allowed bytes are A-Z a-z 0-9 . _ / -; segments cannot be empty, ".", "..", or start with a dot. Folder for list, info, upload, upload_url and move; file for content_get and content_put; new folder for mkdir; source for rename, move and delete.
pathsNomove: sources to move; a non-empty list ignores path and always returns results per item. delete: targets, together with path. Items are clean paths.
actionYesOperation to run. Each oneOf entry describes one action and lists its parameters.
confirmYesPass true only after the user approves this change. Required by: delete.

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is known from structured data. 'Cannot be undone' largely restates destructiveHint, though the framing that folders as well as files are removed adds a small amount of scope information. It says nothing about batch semantics (path + paths), partial failures, or the confirm gate, all of which remain in the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with zero waste; the action and its irreversibility are both front-loaded. Nothing is repeated or padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive tool with two required parameters and batch support, the description is thin: it never mentions that multiple targets can be supplied, that missing targets fail the whole request, or that a confirm flag must be set. The rich schema and annotations compensate, making it adequate but with clear gaps for a high-risk operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, including detailed path rules, the paths/path relationship for delete, and the confirm requirement, so the baseline of 3 applies. The description adds no parameter-level information beyond what the schema already documents.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Deletes files and folders from the site file manager'), so an agent can tell it apart from files_read/files_write. It doesn't explicitly name the nearest destructive siblings (content_delete, ftp_delete) to route between them, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus alternatives such as content_delete or ftp_delete, and no mention of prerequisites or when deletion should be avoided. The only usage-adjacent statement is the irreversibility warning, which is a consequence rather than a selection rule.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

files_readRead site filesC
Read-onlyIdempotent
Inspect

Lists files and folders of the site file manager, returns file info and quota, reads text files.

NameRequiredDescriptionDefault
pageNoList page, from 1.
pathNoClean path without edge slashes, passed as a parameter (never as a URL suffix). Empty string is the site root; content_get, content_put and mkdir need a non-empty path. Allowed bytes are A-Z a-z 0-9 . _ / -; segments cannot be empty, ".", "..", or start with a dot. Folder for list, info, upload, upload_url and move; file for content_get and content_put; new folder for mkdir; source for rename, move and delete.
sortNolist: name (default), size, or mtime. Anything else is treated as name.
limitNolist: the earlier name of per_page; per_page wins when both are set, and 0 counts as not set.
orderNolist: asc (default). Only desc changes direction.
actionYesOperation to run. Each oneOf entry describes one action and lists its parameters.
detailNoRecord form of a paged list. brief (default): name, path, type, size, objects in a folder and modification time (UTC, ISO 8601). Titles and excerpts are plain text; names, logins, paths, URLs and other identifiers are as the source gives them. full: complete records. A list reply is at most 30 KB and holds every record of its page: a record that does not fit in full comes in brief form, marked detail brief, the reply counts such records in brief_records, and get by id returns the complete record; brief records shorten their excerpts, then keep only their ids and titles. Only a page that does not fit even so is cut: truncated is true and next names the offset to go on from.
filterNolist: a quota.limits.filters name, or a comma-separated extension list (png,jpg). Unknown names are ignored.
offsetNoRecords to skip from the start of a list; overrides page. A list reply cut at its size limit names the offset that follows in next.
per_pageNoRecords per page: 1-50, 20 by default, larger values count as 50.

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered. The description adds almost nothing beyond them; the one useful nugget, that only text files can be read, is stated more completely in the schema's content_get entry. No mention of auth requirements, size limits, or error behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence that leads with the primary list capability and then covers the secondary actions. Nothing is padded, though for a 4-action, 10-parameter tool the compression is close to under-specification rather than tight writing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so return values are opaque at the description level, and with four distinct actions and ten parameters the one-sentence summary is thin. It is rescued by unusually rich enum and parameter descriptions in the schema, which supply the action-to-parameter mapping, but the overview itself does little for an agent deciding between content_get and content_read.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the action enum's oneOf entries exhaustively document which parameters each action takes, so the description need not carry parameter meaning. It adds none, which is the correct baseline of 3 when the schema does all the work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names the resource (site file manager) and four concrete operations: list, info, quota, and read text content. It is clearly a read-side tool, so it is distinguishable from files_write and files_delete. It stops short of naming any sibling explicitly, which keeps it at 4 rather than 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It enumerates what the tool can do but never says when to choose it over alternatives — notably content_read, which appears to overlap with content_get, or when a caller should use files_write/files_delete for the mutation side. The only routing signal is the action enum, which is schema data, not description guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

files_writeEdit site filesC
Destructive
Inspect

Uploads files (text, base64 or URL), writes text files, creates folders, renames and moves items in the site file manager.

NameRequiredDescriptionDefault
urlNoupload_url: http:// or https:// URL that ends with a file name and extension.
fileNoupload: synonym for a single text body when files and content are omitted.
nameNoupload: saved name when the request has exactly one file. upload_url: saved name, or the last URL segment when omitted. rename: new leaf name (no slashes) for a single object.
pathNoClean path without edge slashes, passed as a parameter (never as a URL suffix). Empty string is the site root; content_get, content_put and mkdir need a non-empty path. Allowed bytes are A-Z a-z 0-9 . _ / -; segments cannot be empty, ".", "..", or start with a dot. Folder for list, info, upload, upload_url and move; file for content_get and content_put; new folder for mkdir; source for rename, move and delete.
sizeNoupload_direct: exact byte size of the file that will be POSTed to upload_url (1..16777216). The curl body must match it exactly. upload: expected byte size of the single top-level body after base64 decoding; a mismatch fails the call before anything is stored.
filesNoupload: one or more files. Each item is { filename, content } or { filename, content_base64 }. Sent as a repeated multipart field named file. name applies only when this list has one file and no extra top-level body.
itemsNorename batch: map of leaf name to new leaf name inside path. When this object is present the call always returns results per item, even if name is also set.
pathsNomove: sources to move; a non-empty list ignores path and always returns results per item. delete: targets, together with path. Items are clean paths.
actionYesOperation to run. Each oneOf entry describes one action and lists its parameters.
createNocontent_put: create the file when it does not exist. Default false. Parent folder must already exist.
sha256Noupload: expected SHA-256 hex of the single top-level body after base64 decoding; a mismatch fails the call before anything is stored.
contentNocontent_put: new file text (empty string is allowed). upload: text body of a single file when files is omitted.
filenameNoupload and upload_direct: original file name (multipart filename). Falls back to name.
add_wmarkNoupload and upload_url: apply the site watermark when it is enabled and the extension is an allowed image.
upload_idNoupload: id from upload_direct whose bytes were already POSTed. Saved into path under its upload_direct filename, or name when it is the only file. Spent only when that item is uploaded; otherwise it stays usable until it expires.
upload_idsNoupload: several upload_direct ids (a comma-separated string is accepted too), sent after upload_id and inline files. At most 20.
destinationNomove: existing destination folder. Empty string is the site root.
content_base64Noupload: standard base64 body of a single binary file when files is omitted. Inline base64 suits small files only: a long base64 body produced by a model arrives truncated. Foreign characters or a truncated length fail the call.

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare destructiveHint=true and openWorldHint=true, but the description does not explain what may be overwritten or destroyed, whether operations are atomic, how partial per-item failures behave, or what permissions are required. It mostly restates the operation list already present in the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence with no filler, which is appropriately concise. However, for a multi-action destructive tool, the flat operation list could be structured more helpfully around action selection.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The schema is unusually rich, with per-action oneOf descriptions and full parameter documentation, and the annotations cover the safety profile. The description itself remains minimal and omits sibling routing and overwrite/destruction specifics, so it is adequate but not fully complete for a complex 18-parameter write tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all 18 parameters and the action enum in detail. The description only broadly mentions text, base64, and URL uploads and does not add parameter-level meaning beyond that baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names specific write operations: uploading files, writing text, creating folders, renaming and moving items in the site file manager. It clearly identifies a file-mutation tool, but it does not explicitly distinguish itself from siblings such as files_read, files_delete, or content_write.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states what operations are available but gives no guidance on when to use this tool versus files_read, files_delete, content_write, or other write tools. It also omits prerequisites and conditions for choosing among its own actions, leaving selection to the schema.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

forum_deleteDelete forum contentA
Destructive
Inspect

Deletes forums, sections, topics, posts and polls. Cannot be undone.

NameRequiredDescriptionDefault
idNoRecord, category, comment, or forum entity id.
actionYesOperation to run. Each oneOf entry describes one action and lists its parameters.
confirmYesPass true only after the user approves this change. Required by: forum_delete, section_delete, topic_delete, post_delete, poll_delete.
poll_idNoPoll id (forum or site polls).
post_idNoForum post id.
forum_idNoForum id.
topic_idNoTopic id.
section_idNoForum section id.

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is covered; the description adds the irreversibility detail ('Cannot be undone'), which is real value. However, it omits important behavioral facts such as whether deleting a forum cascades to its topics/posts, and that confirm must be true only after user approval — that lives only in the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the scope of deletion and immediately followed by the irreversibility warning. Nothing is wasted or buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter destructive tool with no output schema, the description is adequate but thin: it says what gets deleted and that it is permanent, while the cascade behavior and the human-approval requirement are left to the schema. An agent reading only the description would have an incomplete model of consequences.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the oneOf entries already explain per-action id requirements and the confirm flag, so the schema does the heavy lifting. The description's list of entity types loosely mirrors the five actions but adds no id-format or precedence detail beyond what the schema states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb ('Deletes') and enumerates the exact resource types covered (forums, sections, topics, posts, polls), which maps cleanly onto the action enum. It is clearly distinguishable from sibling forum_read and forum_write by its destructive scope, though it never names those siblings explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the enumeration of entity types plus 'Cannot be undone' signals a destructive operation to be used deliberately. There is no explicit guidance about when to choose this over forum_write, nor any mention of the approval/confirm workflow that the schema requires.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

forum_readRead forumB
Read-onlyIdempotent
Inspect

Reads forums, sections, topics, posts and polls of the forum module on the active site.

NameRequiredDescriptionDefault
idNoRecord, category, comment, or forum entity id.
pageNoList page, from 1.
actionYesOperation to run. Each oneOf entry describes one action and lists its parameters.
detailNoRecord form of a paged list. brief (default): the fields that identify a record, without full texts and HTML; for entries id, title up to 120 characters, status, date added (UTC, ISO 8601), public URL, category id and an excerpt up to 200 characters. Titles and excerpts are plain text; names, logins, paths, URLs and other identifiers are as the source gives them. full: complete records. A list reply is at most 30 KB and holds every record of its page: a record that does not fit in full comes in brief form, marked detail brief, the reply counts such records in brief_records, and get by id returns the complete record; brief records shorten their excerpts, then keep only their ids and titles. Only a page that does not fit even so is cut: truncated is true and next names the offset to go on from.
offsetNoRecords to skip from the start of a list; overrides page. A list reply cut at its size limit names the offset that follows in next.
poll_idNoPoll id (forum or site polls).
post_idNoForum post id.
forum_idNoForum id.
per_pageNoRecords per page: 1-50, 20 by default, larger values count as 50.
topic_idNoTopic id.
section_idNoForum section id.

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered without the description. The description adds only that reads are scoped to the active site, which is genuinely useful context, but says nothing about pagination caps, brief-vs-full defaults or error behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler, and the scope ('active site') is placed at the end where it reads naturally. It is arguably too thin for a ten-action tool, but there is no wasted text to trim.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a ten-action tool with eleven parameters and no output schema, one sentence leaves the dispatcher model, paging behavior and site-scoping mechanics entirely to the schema. The schema is rich enough to carry most of that load, but the description does not prepare an agent for the action-per-call pattern.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%: every action variant and every parameter (id, page, per_page, offset, detail, and each entity id) is documented in the oneOf entries and property descriptions. The description contributes nothing beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The verb 'Reads' plus the enumerated resources (forums, sections, topics, posts, polls) states exactly what data the tool surfaces and implicitly separates it from forum_write and forum_delete. The one gap is that it never mentions the action-dispatcher design, so the multi-operation nature only becomes visible in the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to choose this over forum_write/forum_delete, no mention that a site must first be selected via select_site, and no guidance on choosing among the ten actions. Only the phrase 'active site' hints at a prerequisite, and it is left unexplained.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

forum_writeEdit forumC
Destructive
Inspect

Creates and updates forums, sections, topics, posts and polls; closes, pins, moves, joins and splits topics and posts; votes in polls.

NameRequiredDescriptionDefault
idNoRecord, category, comment, or forum entity id.
nameNoCategory, forum, section, or channel name; guestbook author name; author name or contact person of a publ, load, board, dir or stuff entry.
nfidNoTarget forum id (move/split).
voteNoPoll vote index(es), comma-separated.
ontopNo1 = pin entry/topic.
titleNoEntry or topic title; FAQ subject.
actionYesOperation to run. Each oneOf entry describes one action and lists its parameters.
closedNo1 = create closed topic.
fieldsNoExtra body keys not listed as top-level params.
answersNoPoll answers (| for forum, comma for site polls).
confirmNoPass true only after the user approves this change. Required by: topic_join, topic_split, post_move, poll_join, poll_split.
messageNoFull text (entry, comment, post); the format of an entry text is set by message_type.
poll_idNoPoll id (forum or site polls).
post_idNoForum post id.
user_idNoAct-as user id.
forum_idNoForum id.
passwordNoClosed forum password.
pollonlyNo1 = poll-only mode.
polltimeNoPoll duration, e.g. "1 week".
post_idsNoComma-separated post ids.
questionNoFAQ question text.
topic_idNoTopic id.
author_idNoAuthor user id.
pollmultyNo1 = multi-select poll.
target_idNoJoin/move target id.
section_idNoForum section id.
descriptionNoShort description / FAQ question; its format is set by description_type.

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and destructiveHint=true, so the description's main added duty is to explain consequences, permissions, or gating — none of which it does. The operation list merely restates the action enum, adding no behavioural context such as irreversibility of deletes/moves or that confirm gates destructive actions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence enumerating the operation families, with no filler. It is somewhat redundant with the action enum but remains an efficient one-line summary for a 27-parameter tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The enormous action enum and 100% parameter documentation in the schema carry most of the burden, so the description need not repeat parameters. However, for a destructive, 27-parameter write tool with no output schema, it should at minimum flag the confirm requirement and the read/delete siblings, which it does not.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and each oneOf action entry documents its own required and optional fields, so the schema already carries full parameter meaning. The description adds nothing parameter-specific (e.g. the overloaded id/name fields or required action), so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses concrete verbs and resources ('creates and updates forums, sections, topics, posts and polls; closes, pins, moves, joins and splits') that accurately mirror the action enum, so an agent knows exactly what class of operation this tool performs. It stops short of distinguishing itself from the sibling forum_read and forum_delete tools, which is the missing piece for a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to use this tool versus forum_read (read) or forum_delete (delete), and no prerequisites or ordering advice. It also never mentions the approval workflow encoded in the confirm parameter, which is essential guidance for the join/split/move actions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ftp_deleteRemove FTP passwordA
Destructive
Inspect

Removes the FTP password of the active site: FTP login stops working until a new password is set with ftp_write. The old password cannot be restored. An FTP account of the server environment is deleted with apps_delete ftp_delete instead.

NameRequiredDescriptionDefault
actionYesOperation to run. Each oneOf entry describes one action and lists its parameters.
confirmYesPass true only after the user approves this change. Required by: ftp_password_reset.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true and readOnlyHint=false, but the description adds real consequence detail the annotations cannot convey: FTP login breaks until a new password is set and the old password is unrecoverable. The confirm gate and the 'fails when no password is set' condition live in the schema rather than the description, so it is not fully self-contained on behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences with the consequence front-loaded, which is the right order. The final sentence about apps_delete is garbled ('with apps_delete ftp_delete instead'), costing clarity in what should be a crisp disambiguation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter destructive tool with full schema coverage and no output schema, the description covers irreversibility, the resulting broken-login state and the sibling to use for a different deletion. The only gap is the imprecise cross-reference sentence and no mention of how to restore service beyond naming ftp_write.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the enum documents the single action plus its required confirm parameter in detail. The description adds no parameter-level syntax or format information beyond what the schema already provides, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (remove the FTP password of the active site) and immediately delimits scope against two siblings: ftp_write to set a new password and apps_delete for deleting an FTP account. An agent can distinguish this from every other ftp_* and *_delete tool without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear when-to-use context (only for the password of the active site) and names the alternative path for a related-but-different operation (deleting an FTP account via apps_delete). No explicit exclusions such as prerequisites for the 'active site' selection, and the final cross-reference sentence is grammatically mangled, which slightly blunts the routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ftp_readRead FTP accessA
Read-onlyIdempotent
Inspect

Returns the FTP connection details of the active site: host, port, user name and whether an FTP password is set. Never returns the password and does not change anything. Site files are read with files_read. FTP accounts of the server environment are listed with apps_read ftp_list.

NameRequiredDescriptionDefault
actionYesOperation to run. Each oneOf entry describes one action and lists its parameters.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered structurally. The description adds useful behavioral context by stating that the password is never returned and that the tool does not change anything, though the latter largely reinforces the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three tight sentences with the primary return behavior front-loaded, followed by security behavior and sibling routing. Every sentence contributes useful selection or invocation context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only tool with rich annotations and a fully documented one-parameter schema, the description supplies the remaining needed context: what is returned, that the password is excluded, and which sibling tools to use for related tasks. No output schema is present, but the return fields are named in the description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is only one parameter, and the schema documents it fully with a 100% schema description coverage and an enum value describing the operation. The description does not add parameter-level semantics beyond the overall tool purpose, so the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: it returns the FTP connection details of the active site, and it enumerates the returned fields (host, port, user name, password-set status). It also clearly distinguishes the tool from files_read and apps_read ftp_list, so an agent can identify its purpose without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly routes adjacent needs: site files are read with files_read, and server-environment FTP accounts are listed with apps_read ftp_list. It also states that the tool does not change anything, which excludes mutation use cases, leaving little ambiguity about when to call this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ftp_writeSet FTP passwordA
Destructive
Inspect

Sets the FTP password of the active site when none is set, or replaces the current one (the old password stops working). The reply has the connection details without the password. FTP accounts of the server environment are created and changed with apps_write.

NameRequiredDescriptionDefault
actionYesOperation to run. Each oneOf entry describes one action and lists its parameters.
confirmYesPass true only after the user approves this change. Required by: ftp_password_set, ftp_password_change.
ftp_passwordNoNew FTP password: 6-15 characters, only Latin letters, digits, _ and -.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond destructiveHint=true, the description discloses the concrete consequence (the old password stops working) and the response contract (connection details returned without the password), plus the user-approval requirement implied by confirm. That is exactly the extra context annotations cannot express.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the core action and its conditional scope, then the side effect, then the response, then the alternative. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive 3-parameter write with full schema coverage, no output schema, and annotations covering safety, the description supplies the remaining essentials: what gets invalidated, what the reply contains, and where to go for other FTP-account work.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% — each action, confirm, and the password format are already documented in the schema. The description adds the outcome of the change but no additional parameter syntax or constraints, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource (sets the FTP password of the active site) with the two states it operates in spelled out (none set vs. replace existing). It also names a sibling (apps_write) for the adjacent FTP-account operations, so an agent can orient it against neighbors.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clear context for both branches and a routing pointer: FTP accounts of the server environment are created/changed with apps_write, not here. It does not explicitly say when NOT to call it (e.g., prerequisite of selecting an active site), which keeps it just short of a 5; the per-action when-to-use is fully covered by the schema oneOf entries.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_sitesList sitesA
Read-onlyIdempotent
Inspect

Lists the uCoz sites owned by the signed-in account.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered by structured data. The description adds the useful scoping detail that results are limited to the signed-in account's sites, but says nothing about pagination or result ordering.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, tight sentence with no wasted words. The key qualifier ("owned by the signed-in account") is included without preamble.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple zero-parameter read tool whose safety traits are already declared by annotations, the description is essentially sufficient. The only mild gap is that with no output schema, the description could hint at what a listed site entry contains, but this is minor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the schema carries no per-parameter burden and the baseline for a no-param tool is 4. There is nothing further the description could document.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ("Lists") and resource ("uCoz sites") with a clear scope ("owned by the signed-in account"). It is clear on its own, though it does not explicitly distinguish itself from the sibling select_site or create_site.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: an agent would infer this is for discovering which sites exist before selecting or operating on one. There is no explicit statement of when to use it versus select_site, nor any prerequisites or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

modules_readRead modulesB
Read-onlyIdempotent
Inspect

Lists installed and available modules of the active site; shows module status and the indexing quarantine status.

NameRequiredDescriptionDefault
actionYesOperation to run. Each oneOf entry describes one action and lists its parameters.
offsetNoRecords to skip from the start of a list; overrides page. A list reply cut at its size limit names the offset that follows in next.
module_codeNoLowercase module code, as listed by modules_list (field module) or active_mods (field code) on the active site.

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive, and closed-world, so the safety profile is covered. The description contributes the useful scoping detail that it operates on the 'active site' and mentions the quarantine-status dimension, but says nothing about pagination limits or result shape beyond that.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single compact sentence, front-loaded with the primary purpose and scoped to the active site. The second clause slightly overlaps with the first ('installed and available modules' vs 'module status'), but there is no padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description does take on some burden of describing returns, and it does so at a high level (module status, quarantine status) while the schema handles all parameters. Combined with the read-only annotations, an agent has enough to call this correctly, though return fields and pagination behavior are only inferable from the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%: every action variant, the offset semantics, and the module_code format are fully documented in the schema. The description adds no parameter detail beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb and resource (lists modules of the active site) and even enumerates the kinds of information returned (module status, indexing quarantine status), so the agent knows exactly what this tool surfaces. It does not explicitly differentiate itself from modules_write/modules_uninstall, but the read/list framing makes the boundary reasonably clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description offers no when-to-use guidance, no prerequisites, and never names an alternative such as modules_write or modules_uninstall. The action enum lives entirely in the schema, so the description itself gives the agent nothing to route on.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

modules_uninstallUninstall moduleB
Destructive
Inspect

Uninstalls a module from the active site. Module data may be lost.

NameRequiredDescriptionDefault
actionYesOperation to run. Each oneOf entry describes one action and lists its parameters.
confirmYesPass true only after the user approves this change. Required by: module_uninstall.
module_codeYesLowercase module code, as listed by modules_list (field module) or active_mods (field code) on the active site.

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already set destructiveHint=true and readOnlyHint=false, so the safety profile is declared. The description's "Module data may be lost" sharpens that into a concrete consequence (data, not just config) and adds the "active site" scoping, but says nothing about required permissions, reversibility, or dependency effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, zero filler, with the action and its risk front-loaded. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 3-parameter, confirm-gated destructive tool with full schema coverage and explicit destructive annotations, the description is nearly sufficient. It only misses prerequisites such as dependencies or whether data loss is immediate vs deferred.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the schema itself documents module_code lookup sources and the confirm approval gate. The description adds no parameter-level meaning beyond that, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource with scope: "Uninstalls a module from the active site." An agent can distinguish it from modules_read/modules_write, though the description never explicitly contrasts uninstall with a disable/deactivate path via modules_write.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No statement of when to use this versus the sibling modules_write or modules_read tools, and no prerequisites or warnings about dependencies. Usage is only implied by the verb.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

modules_writeConfigure modulesB
Destructive
Inspect

Installs a module, enables or disables uAPI for a module, lifts the indexing quarantine.

NameRequiredDescriptionDefault
actionYesOperation to run. Each oneOf entry describes one action and lists its parameters.
confirmNoPass true only after the user approves this change. Required by: quarantine_unlock.
module_codeNoLowercase module code, as listed by modules_list (field module) or active_mods (field code) on the active site.

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=true and openWorldHint=false, so the safety profile is covered. The description adds the scoping detail that quarantine_unlock affects the whole site's indexing and that the other actions target a module, but it is largely a restatement of the enum descriptions and says nothing about irreversibility or side effects of disabling uAPI or installing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence that enumerates all four operations with no filler. It is appropriately sized for a multi-action tool, though the list-form phrasing is slightly dense for an opening line.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive 3-parameter mutation tool with no output schema, the description covers the 'what' but omits usage guidance and confirmation-flow context, relying entirely on the schema and annotations. It is minimally complete but leaves the agent to infer routing and approval semantics.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with per-action oneOf descriptions spelling out required parameters (module_code, confirm) and the enum values documented inline. The description adds no syntax or format detail beyond the schema, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a concrete verb set (installs, enables/disables uAPI, lifts quarantine) and the resource (module), and it maps cleanly onto the four enum actions. It is clearly a write/mutation tool distinct from modules_read and modules_uninstall, but it never explicitly names those siblings or contrasts itself with them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to use this tool versus modules_read, modules_uninstall, or the *_write siblings, and no mention of prerequisites or the user-approval flow that the confirm parameter implies. The agent must infer all routing and sequencing from the schema alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

select_siteSelect siteAInspect

Sets the active site for the following calls in this session: the site tools then read and change that site. If the site has no active API key yet, creates one for MCP access. Site content is not changed.

NameRequiredDescriptionDefault
site_idYesNumeric site id from list_sites

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false with destructiveHint=false, and the description adds meaningful context beyond them: selecting a site can create an API key if none exists (a real write side effect), and it explicitly reassures that site content is not changed. That resolves the tension between 'not destructive' and 'not read-only'. It does not cover failure cases (invalid site_id) or permission requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three compact sentences, each earning its place: scope of effect, API-key side effect, and the content-unchanged reassurance, with the primary purpose front-loaded. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter session-state tool with no output schema and non-destructive annotations, the description covers purpose, scope, persistence, and side effects adequately. Minor gaps remain around behavior for an unknown/invalid site_id and whether the selection survives beyond the session boundary.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single parameter already documents 'Numeric site id from list_sites', so the schema carries the parameter meaning. The description implies which site is targeted but adds no format, range, or validation detail beyond the schema — the baseline 3 for high coverage applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Sets the active site') and immediately scopes it ('for the following calls in this session'), which distinguishes it cleanly from siblings like list_sites and create_site. An agent can tell this is a session-state setter without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when this tool matters: it configures the site that subsequent site tools will read and change, and the schema points to list_sites as the id source. It does not explicitly name alternatives or state when-not-to-call, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

settings_readRead module settingsA
Read-onlyIdempotent
Inspect

Reads module settings of the active site: lists the modules that have settings and whether each one is active, and returns the current settings of a module. Does not change anything.

NameRequiredDescriptionDefault
actionYesOperation to run. Each oneOf entry describes one action and lists its parameters.
moduleNoModule code. site holds the general site settings.
offsetNoRecords to skip from the start of a list; overrides page. A list reply cut at its size limit names the offset that follows in next.

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true and a closed world, so the safety profile is fully covered and 'Does not change anything' is largely redundant. The description adds a little context by scoping reads to the active site, but says nothing about permissions or how access-key redaction is returned beyond what the schema already notes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single compact sentence with the purpose and the two sub-behaviors front-loaded, followed immediately by the read-only reassurance. Efficient, though the semicolon clause packs two actions into one long sentence that could be split for faster scanning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-value burden and does so adequately: it states that the list includes which modules have settings and whether each is active, and that a module's settings come back nested. Minor gaps remain on permissions and truncation behavior, but the schema covers truncation via offset/next.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the oneOf action entries, the module enum and the offset/next semantics are already fully documented in the schema. The description contributes no additional parameter meaning such as mutual exclusivity rules or defaults, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Reads module settings of the active site') and enumerates the two concrete behaviors: listing modules with active status, and returning a module's current settings. The scope is narrowed to the active site, so an agent can distinguish it from the sibling settings_write and from app/forum-specific readers without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the closing 'Does not change anything' signals read-only intent, which points an agent away from settings_write, but there is no explicit when-to-use statement, no conditions, and no named alternatives (e.g. modules_read vs settings_read). The agent must infer the routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

settings_writeChange module settingsA
Destructive
Inspect

Changes the settings of a module of the active site: updates only the passed keys and reports which of them changed. A dry run returns the current values of the keys without saving.

NameRequiredDescriptionDefault
actionYesOperation to run. Each oneOf entry describes one action and lists its parameters.
moduleYesModule code. site holds the general site settings.
valuesYesFlat setting keys and new values, e.g. { "name": "News", "entries_per_page": 10, "comments_enabled": true }. A flat key joins the nested path with _ (cover.thumb_width -> cover_thumb_width); list fields such as fields are sent whole. Key names are 1-64 letters, digits or _; field names are described in the module OpenAPI specification (docs_tool).
confirmNoPass true only after the user approves this change. Required in some cases by: settings_update (see the action).
dry_runNoReturn the current values of the requested keys without saving.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and destructiveHint=true, so the safety profile is partly covered. The description adds genuinely new behavior: only passed keys are written, the response distinguishes changed from unchanged keys, and a dry run previews without saving. It stops short of stating that some changes require confirm or are irreversible, which lives in the action's schema text rather than the description.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the mutation semantics and followed by the dry-run caveat; no filler, no restatement of the title. Every clause carries information an agent needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive multi-module mutation, the description covers purpose, partial-update scope, result reporting and dry-run preview, while the schema carries the heavy confirm/irreversibility details and annotations flag destructiveness. The one meaningful omission is that the description never signals "some keys require confirm and may destroy data" — an agent skimming only the prose would miss that before opening the action enum text.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and every parameter carries a rich description, including the enum-constrained action with full confirm semantics and value-shape rules. The top-level description adds no parameter meaning beyond that (module, values, confirm and dry_run are untouched), so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Changes the settings of a module of the active site") plus the key semantic detail that it is a partial update touching only passed keys. It does not explicitly name settings_read or modules_write as the counterpart, so sibling differentiation is left to the tool-name pairing rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the dry_run sentence hints at a preview-then-commit workflow, and "reports which of them changed" implies verification use. There is no explicit when-to-use versus settings_read, no prerequisite guidance (e.g. needing module knowledge from modules_read or docs_tool), and no when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

shop_deleteDelete shop contentA
Destructive
Inspect

Deletes products, product and category images, stock records, basket items and product comments, and clears the wishlist. Cannot be undone.

NameRequiredDescriptionDefault
idNoGoods, category, comment, or basket line id.
idsNoIds separated by commas (invoice_*: order ids, also separated by |; stock_remove).
imgNoImage slot number, 0 for the main image.
actionYesOperation to run. Each oneOf entry describes one action and lists its parameters.
fieldsNoExtra form keys (checkout field_N, stock_*, var_*, cnt_REC_ID, …). Routing and mode keys (method, mode, del, page, …) are ignored.
confirmNoPass true only after the user approves this change. Required by: delete, img_del, category_image_delete, variation_dict_delete, stock_remove, stock_remove_all, comments_delete, wishlist_clear. Required in some cases by: basket_delete (see the action).
del_allNo1 = delete all images (img_del); otherwise img_del needs img.
files_sequenceNoImage order after single img_del.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, but the description adds the important behavioral detail that deletion 'Cannot be undone' and specifies the full scope of what may be destroyed. It does not cover permissions or confirm requirements, but those are handled by the schema and annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core action and resource scope, followed by the irreversibility warning. Every sentence earns its place with no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a multi-action destructive tool with rich schema and annotations, the description is sufficiently complete: it names all affected resource types and warns that deletion is permanent. The action enum details and confirm requirements are fully covered by the schema, though the description could have briefly mentioned that an action parameter selects the specific operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the detailed oneOf action parameter and other fields already document parameter semantics thoroughly. The description itself adds no parameter-specific detail beyond listing affected resources, making the baseline 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb, 'Deletes,' and enumerates the exact resources affected: products, images, stock records, basket items, comments, and wishlist. This clearly distinguishes it from shop_read and shop_write siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the destructive operation and the warning 'Cannot be undone,' but there is no explicit guidance on when to choose this over shop_write or other deletion tools, nor any stated prerequisites or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

shop_readRead shopB
Read-onlyIdempotent
Inspect

Reads shop data of the active site: categories, products, variations, stock, basket, checkout form, orders, product comments, currencies and balance.

NameRequiredDescriptionDefault
idNoGoods, category, comment, or basket line id.
cntNoBasket quantity.
idsNoIds separated by commas (invoice_*: order ids, also separated by |; stock_remove).
pidNoParent category id.
dateNoinvoices_list created period date1|date2.
hideNoHide flag or invoices_list group.
pageNoList page, from 1.
pnumNoGoods list page, the earlier name of page; page wins when both are set.
sortNoGoods list sort field.
viewNoGoods list view. Default usergoods when user_id is given, otherwise allgoods.
cdateNoinvoices_list delivery period date1|date2.
f_artNo
orderNoList asc/desc or order hash.
actionYesOperation to run. Each oneOf entry describes one action and lists its parameters.
detailNoRecord form of a paged list. brief (default): the fields that identify a record, without descriptions and HTML; for products id, title up to 120 characters, status (visible or hidden), date added (UTC, ISO 8601), public URL, price, stock, category id and an excerpt up to 200 characters. Titles and excerpts are plain text; names, logins, paths, URLs and other identifiers are as the source gives them. full: complete records. A list reply is at most 30 KB and holds every record of its page: a record that does not fit in full comes in brief form, marked detail brief, the reply counts such records in brief_records, and get by id returns the complete record; brief records shorten their excerpts, then keep only their ids and titles. Only a page that does not fit even so is cut: truncated is true and next names the offset to go on from.
f_nameNoGoods name filter (plain; MCP encodes Base64).
f_warrNo
offsetNoRecords to skip from the start of a list; overrides page. A list reply cut at its size limit names the offset that follows in next.
statusNoOrder status code.
f_brandNo
f_priceNoPrice filter MIN|MAX|CUR.
f_stockNo
inv_sumNoinvoices_list sum1|sum2.
user_idNoUser id filter or balance target.
f_statusNo
f_weightNo
goods_idNoWishlist goods id (get).
per_pageNoRecords per page: 1-50, 20 by default, larger values count as 50.
parent_idNoSynonym for pid / category_list parent.
payment_idNo
promo_codeNo
delivery_idNo
get_globalsNo1 = global categories in category_list.
group_courierNo
variation_crcNoVariation hash from variations_list.
custom_delivery_taxNo

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered. The description's only added context is that reads target the 'active site' (implying a dependency on select_site) and its enumeration of domains; it says nothing about permissions, pagination behavior, or cost of broad reads.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One front-loaded sentence with a clear verb and scope and no wasted clauses. The trailing domain list is a slight dump but each item maps to a real action, so it earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 14-action, 36-parameter dispatcher this is thin: no explanation of how to choose an action, no mention that detail=full is needed for complete records, and no note that many params are action-specific. The unusually self-documenting oneOf schema carries most of that burden, keeping it at minimum-viable rather than inadequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds no information about any of the 36 parameters, not even the required `action` dispatcher. Schema coverage is 69% (below the 80% threshold where a 3 baseline would apply), so the description should compensate for the undocumented quarter but does not; the schema's oneOf blocks do the real work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Reads') and resource ('shop data of the active site') and enumerates the nine data domains covered, so an agent knows the breadth of the read surface. The read/write/delete split against shop_write and shop_delete is implied by the verb but not explicitly stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no when-to-use, when-not-to-use, or alternative routing: it never says to use shop_write for mutations or shop_delete for removal. Action selection among the 14 operations is left entirely to the schema's oneOf blocks, not to the description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

shop_writeEdit shopA
Destructive
Inspect

Creates and updates shop categories, products, product images, variations, stock, basket and checkout, orders and their status, payment method and delivery, product comments and currency rates. No action takes or sends money through a payment system: placing an order or changing its payment method charges nothing (the new method may also set the payment processing status), a paid order status is set without a payment, and order status changes may credit or debit the internal shop balances of buyers, user sellers and referrers kept on the site; there is no action that sets or changes a balance directly.

NameRequiredDescriptionDefault
idNoGoods, category, comment, or basket line id.
artNoSKU / article.
cntNoBasket quantity.
idsNoIds separated by commas (invoice_*: order ids, also separated by |; stock_remove).
imgNoImage slot number, 0 for the main image.
nowNo1 = buy now.
optNoSelected options OPTION_ID-VALUE_ID:… for basket/order.
pidNoParent category id.
posNoCategory position.
urlNoCustom URL slug.
consNo
dscrNoFull description; pass html_dscr=1 when HTML.
hideNoHide flag or invoices_list group.
modeNocheckout_update mode.
nameNoGoods or category name.
noteNo
prosNo
tagsNo
typeNoGoods type: 0 material, 1 file, 2 e-code, 3 service.
unitNo
warrNo
brandNoBrand.
briefNoShort description.
orderNoList asc/desc or order hash.
priceNoPrice (goods or variation_update).
soldsNo
stockNoStock count.
viewsNo
actionYesOperation to run. Each oneOf entry describes one action and lists its parameters.
cat_idNoGoods category id (add/update).
fieldsNoExtra form keys (checkout field_N, stock_*, var_*, cnt_REC_ID, …). Routing and mode keys (method, mode, del, page, …) are ignored.
imagesNoFiles for img_add (remote upload). Each item is { filename, content_base64 }, { upload_id }, or { site_path }. Appended as file_add_N after the image_*/file_* slots.
statusNoOrder status code.
undiscNo
valuesNoVariation dictionary values, comma-separated (S,M,L).
weightNo
confirmNoPass true only after the user approves this change. Required by: img_edit, variation_gen, checkout_submit, invoice_status, invoice_payment.
messageNoComment text.
opt_selNoOption set for stock_add (e.g. 2-3:4).
orderedNo
stock_qNo
user_idNoUser id filter or balance target.
cats_addNoExtra category ids [ID1, ID2, …].
entry_idNoGoods id for comments_add.
price_inNoPurchase price.
rate_numNo
rate_sumNo
ch_addcatNo1 when cats_add is passed.
curr_codeNo
curr_rateNo
file_pathNoSynonym for image_path (local MCP server path).
html_dscrNo1 = dscr is HTML.
meta_dscrNo
parent_idNoSynonym for pid / category_list parent.
price_oldNoOld price.
add_groupsNo
global_catNo
image_pathNoLocal MCP server path for image upload. Missing files are an error; remote agents must use image_base64, image_upload_id, or image_site_path.
meta_titleNo
payment_idNo
promo_codeNo
delivery_idNo
file_base64NoSynonym for image_base64.
image_pathsNoComma-separated local MCP server paths (img_add). Missing files are an error.
view_groupsNo
file_add_cntNo
image_base64NoBase64 image body with image_filename (remote upload). Wins over image_upload_id, image_site_path, and image_path.
file_filenameNoSynonym for image_filename.
group_courierNo
variation_crcNoVariation hash from variations_list.
file_site_pathNoSynonym for image_site_path.
file_upload_idNoSynonym for image_upload_id.
image_filenameNoFile name for image_base64, with extension.
image_site_pathNoFile already on the site (img/x.jpg or its full site URL). Wins over image_path.
image_upload_idNoupload_id from upload_direct. Wins over image_site_path and image_path.
image_site_pathsNoComma-separated site files for img_add (img/x.jpg or full site URLs).
image_upload_idsNoComma-separated upload_id values from upload_direct for img_add.
custom_delivery_taxNo
subscribe_to_repliesNo
exclude_from_discountNo

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly=false, destructive=true, and openWorld=true. The description adds important domain-specific behavior: no action takes or sends money, payment-method changes may set processing status, order status changes may credit or debit internal shop balances, and no action directly sets a balance. It could also mention confirmation requirements for destructive actions, but that detail is covered in the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose and limited to two sentences with no filler. The second sentence is dense and lengthy, but it carries necessary financial caveats for a destructive shop-write tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the rich action schema and annotations, the description supplies the high-level scope and critical financial/balance side effects that would otherwise be missed. It omits explicit routing to shop_read/shop_delete and confirmation guidance, but the schema covers action-specific details and the sibling names provide strong context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description gives no parameter-level meaning beyond listing the shop areas affected. With 80 parameters and only 64% schema description coverage, many arguments rely entirely on schema text, and the description does not compensate for undocumented parameters or explain how action-specific parameters are selected.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses clear write verbs ('Creates and updates') and enumerates the shop domains covered: categories, products, images, variations, stock, basket, checkout, orders, comments, and currency rates. It is clearly a broad write tool, but it does not explicitly distinguish itself from siblings like shop_read or shop_delete.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The opening 'Creates and updates...' implies this tool is for write/edit operations, and the payment caveat clarifies that it does not process real money. However, it never says when to use this versus shop_read for reads or shop_delete for deletions, nor does it flag when to avoid it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

skills_tooluCoz agent skillsBInspect

Looks up official uCoz agent skills. resolve matches a skill to a task description, catalog lists available skills, register_usage records skill usage for the selected site (requires select_site).

NameRequiredDescriptionDefault
refNoGit branch or tag. Default: main.
repoNoGitHub repo with skills. Default: ucoz-skills/agent-skills.
taskNoresolve: user task wording (the first 2000 characters are matched).
limitNoresolve: how many matching skills to return, the primary one included (default 3, up to the whole catalog).
scopeNoinstall/status paths: global (~/.cursor/skills) or project (workspace/.cursor/skills). Default global.
actionYesresolve — match skill by task. catalog — GitHub list. status — check_paths of a skill installation. install — source and target location of a skill. register_usage — site usage tracking (select_site); best effort: recorded=false with a message when tracking is temporarily unavailable.
clientNoIDE client for status/install paths (default auto → cursor).
compareNostatus: include catalog latest_version.
versionNoregister_usage: skill version (synonym skill_version).
skill_idNoSlug (^[a-z0-9-]+$). Required for install; optional for catalog/status/register_usage.
skill_pathNoregister_usage: path to SKILL.md (alternative to skill_id + version).
skill_versionNoSynonym for version (register_usage).

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false and openWorldHint=true, meaning the agent knows writes/network are involved, but the description never explains that 'install' writes skill files into a filesystem path, what status inspects, or that behavior depends on a remote GitHub repo. The only added context is the select_site prerequisite and the best-effort tracking note (which is already duplicated from the schema). For a multi-mode tool with two unmentioned mutating actions, this is thin.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tight sentence with the primary purpose front-loaded and zero filler. It loses a point only because compression came at the cost of omitting two of the five actions rather than being deliberately scoped.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 12 parameters, 5 enum-gated actions, and no output schema, the description should explain each mode. It covers only resolve/catalog/register_usage, leaving status and install (the mutating one) entirely unexplained, so an agent cannot confidently select or invoke those modes from the definition alone.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter is already documented in the input schema, including action, scope, client, and skill_id semantics. The description adds nothing beyond that (no mention of repo/ref defaults or limit behavior), so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Looks up official uCoz agent skills') and enumerates three actions, which distinguishes it clearly from the CRUD siblings. However, the schema exposes five actions (resolve, catalog, status, install, register_usage) while the description names only three, so the stated purpose under-describes the tool's actual surface.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives partial routing cues ('resolve matches a skill to a task description, catalog lists available skills') and one hard prerequisite ('register_usage ... requires select_site'). But there is no guidance on when to choose status vs install, no mention of when this tool should be preferred over docs_tool, and no exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

subscriptions_deleteDelete subscriptionsB
Destructive
Inspect

Deletes tariff plans and legacy tariffs, and cancels subscriptions. Cannot be undone.

NameRequiredDescriptionDefault
idNoLegacy tariff id.
actionYesOperation to run. Each oneOf entry describes one action and lists its parameters.
confirmYesPass true only after the user approves this change. Required by: plan_delete, legacy_item_delete, subscription_cancel.
plan_idNoTariff plan id.
subscription_idNoSubscription id.

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is covered structurally. The description adds a reinforcing 'Cannot be undone' warning but goes no further: it does not disclose the approval/confirm gate, the no-refund behavior of cancellation, or what happens to access on cancel — all of which live only in the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short, front-loaded sentences with the destructive operation stated first and the irreversibility caveat second. No waste, though the second sentence largely restates destructiveHint and the first compresses three distinct operations into one clause.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 5-parameter destructive tool with three distinct modes and a mandatory confirmation flag, the description is minimally adequate: the schema compensates, but the description never signals the multi-action dispatch or the user-approval prerequisite, which are the two things most likely to cause a bad call.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, including per-action requirements and the confirm gate, so the schema carries parameter meaning fully. The description adds nothing beyond it and never references action, confirm, or the id/plan_id distinction; baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb with three enumerated resources ('deletes tariff plans and legacy tariffs, and cancels subscriptions') that map cleanly onto the action enum. It doesn't explicitly contrast itself with sibling tools like subscriptions_write or templates_delete, but an agent can tell it is the destructive member of the subscriptions family.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to prefer this over alternatives such as subscriptions_write (e.g., downgrade versus cancel) or which of the three actions applies in a given situation. The only contextual statement is the irreversibility warning, which is a hazard note rather than usage routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

subscriptions_readRead subscriptionsB
Read-onlyIdempotent
Inspect

Reads tariff plans, subscriptions, subscribers, access checks and payments of the Subscriptions module on the active site.

NameRequiredDescriptionDefault
pNoList page, the earlier name of page; page wins when both are set.
idNoLegacy tariff id.
pageNoList page, from 1.
queryNoSearch query for subscribers/payments lists.
actionYesOperation to run. Each oneOf entry describes one action and lists its parameters.
detailNoRecord form of a paged list. brief (default): id, status, plan, user id and email, dates (UTC, ISO 8601); payments also the amount. Titles and excerpts are plain text; names, logins, paths, URLs and other identifiers are as the source gives them. full: complete records. A list reply is at most 30 KB and holds every record of its page: a record that does not fit in full comes in brief form, marked detail brief, the reply counts such records in brief_records, and get by id returns the complete record; brief records shorten their excerpts, then keep only their ids and titles. Only a page that does not fit even so is cut: truncated is true and next names the offset to go on from.
offsetNoRecords to skip from the start of a list; overrides page. A list reply cut at its size limit names the offset that follows in next.
statusNoStatus filter (comma-separated).
date_toNoPayment date upper bound (unix).
plan_idNoTariff plan id.
user_idNoUser id.
per_pageNoRecords per page: 1-50, 20 by default, larger values count as 50.
date_fromNoPayment date lower bound (unix).
payment_idNoPayment id.
expires_beforeNoUnix timestamp filter.
subscription_idNoSubscription id.

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is fully covered by structured data. The description's only added context is site-scoped execution, which is genuinely useful. Rate limits, permission requirements and the 30 KB reply cap are left entirely to the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One front-loaded sentence with the resource list immediately after the verb; nothing is wasted or padded. It is arguably too terse for a 12-action tool, but the dimension is about avoiding bloat and this is tight.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 12-action paginated tool with no output schema, the description should at least signal the action-multiplexing pattern and that paged list replies can be truncated. The exceptionally rich schema and enum descriptions compensate for most of that gap, so this is adequate rather than deficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the `action` enum carries per-operation descriptions listing required and optional parameters, so the schema is doing all the work. The description contributes nothing about the 16 parameters. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ("Reads") plus the concrete resources covered: tariff plans, subscriptions, subscribers, access checks and payments, scoped to the Subscriptions module on the active site. That is enough to distinguish it from subscriptions_write/subscriptions_delete. It stops short of saying this is a single multiplexed entry point whose behavior is selected by the `action` enum, which is the tool's defining shape.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No indication of when to pick this tool over siblings, no prerequisite about the active site needing to be selected first, and no note that write operations belong to subscriptions_write. The only usage-adjacent phrase is "on the active site," which implies scope but gives no instruction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

subscriptions_writeEdit subscriptionsA
Destructive
Inspect

Creates and updates tariff plans and subscriptions: grants access and trials, renews, changes plan, pauses and resumes, records and confirms payments. No action charges or refunds money by itself: grant, trial, renew, plan change and payment confirmation give paid access without payment, and auto-renewal lets the payment system charge the saved payment method of the subscriber, possibly within the hour when the period ends soon (also turned back on by renew, resume and payment confirmation when a payment method is saved, even if it was turned off).

NameRequiredDescriptionDefault
idNoLegacy tariff id.
typeNoPlan type: 0 free, 1 one-time, 2 recurring, 3 donate.
priceNo
titleNoPlan title (plan_add/update).
actionYesOperation to run. Each oneOf entry describes one action and lists its parameters.
amountNoPayment amount in minor currency units.
fieldsNoExtra request fields described in the subscriptions OpenAPI specification (docs_tool).
periodNoRecurring period in days.
confirmNoPass true only after the user approves this change. Required by: subscription_grant, payment_confirm.
plan_idNoTariff plan id.
user_idNoUser id.
currencyNoISO 4217 code, e.g. RUB.
group_toNoGroup id while subscription is active.
intervalNoSubscription interval in days.
price_oldNo
group_backNoGroup id after subscription ends.
payment_idNoPayment id.
descriptionNoPlan description.
is_discountNo
is_advantageNo
text_advantageNo
transaction_idNoIdempotent payment transaction id.
trial_intervalNo
advantage_itemsNoAdvantage lines separated by newline.
subscription_idNoSubscription id.
payment_method_idNo

TDQS

A4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag this as destructive and not read-only, and the description adds substantial extra context: no action charges or refunds money on its own, grant/trial/renew/plan change/payment confirm hand out paid access without payment, and auto-renewal can charge the saved card, possibly within the hour, and is silently re-enabled by renew/resume/payment confirm. These are exactly the side effects an agent must know before calling a destructive write tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded, which is good, but the second sentence is a dense run-on with a nested parenthetical ('...possibly within the hour when the period ends soon (also turned back on by renew, resume and payment confirmation...)') that is hard to parse. Two long sentences for a 16-action tool is defensible in size but poorly structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 26-parameter, 16-action mutation tool with no output schema, the description covers the critical risk surface (no money movement, unpaid access grants, auto-renewal surprises). Per-action parameter requirements are delegated to the schema, which is reasonable, though a pointer to subscriptions_read for lookup and to docs_tool for the fields object would round it out.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 73% and the oneOf entries already document required/optional fields per action, so the parameter layer is largely self-contained. The description itself adds no syntax or format detail for parameters such as amount, confirm, or the loosely typed price/price_old fields, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific set of write verbs and resources: 'Creates and updates tariff plans and subscriptions', then enumerates the operation families (grants, trials, renew, change plan, pause/resume, record/confirm payments). This makes it immediately distinguishable from subscriptions_read and subscriptions_delete without needing the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when each action applies but never states explicit when-to-use/when-not-to-use rules versus alternatives (e.g. read vs write, or docs_tool for extra fields). The per-action preconditions are present, but they live in the schema's oneOf entries rather than in the description, leaving routing guidance implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

templates_deleteDelete site designB
Destructive
Inspect

Deletes global blocks, menus, mail forms and fields, site pages and template backups, or restores a backup over the current templates. Cannot be undone.

NameRequiredDescriptionDefault
idNoGlobal block id (synonym for gblock_id).
pdaNoMobile (PDA) version flag of a global block.
actionYesOperation to run. Each oneOf entry describes one action and lists its parameters.
confirmYesPass true only after the user approves this change. Required by: delete_backup, restore_backup, gblock_delete, menu_delete, mail_delete_form, mail_delete_field, page_delete.
menu_idNoMenu id from menu_list.
page_idNoSite page id. Page 1 cannot be deleted.
backup_idNoTemplate backup id from list_backups.
gblock_idNoGlobal block id.
mail_form_idNoMail form id from mail_list_forms.
mail_field_idNoMail form field id from mail_list_fields.

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, and 'Cannot be undone' largely restates that. The one genuine addition is that this tool also restores a backup over the current templates — a destructive overwrite that a 'delete' tool name would not suggest. No permission, ordering, or approval context is added beyond what annotations and the confirm parameter already cover.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tightly-packed sentence with the resource scope front-loaded and the irreversibility warning last. Every clause carries information; the only minor cost is that bundling seven action modes into one sentence makes it dense.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter, seven-action destructive tool the description plus a very rich oneOf schema and destructive annotations gives an agent enough to call it correctly, and no output schema is needed here. What is thin is the operational context: ordering/prerequisites against templates_read and the backup-listing tools, and the fact that 'restore' is not a deletion.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and every parameter plus each action's required set is documented inline via oneOf, so the schema does the heavy lifting. The description adds no parameter-level meaning (no required-field callout, no id-sourcing hints) beyond what the schema provides. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and enumerates the exact resource types it acts on (global blocks, menus, mail forms/fields, pages, backups), which is far more informative than the title alone. It also discloses the non-obvious restore behavior. It does not distinguish itself from the many sibling *_delete tools (content_delete, tmaker_delete, etc.), so the boundary of 'site design templates' vs other deletable entities is left implicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit when-to-use/when-not guidance and no naming of alternatives such as templates_write or the per-domain delete siblings. The enumeration of deletable entities only weakly implies the usage context, and nothing warns that restore_backup overwrites current templates rather than removing something.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

templates_readRead site designA
Read-onlyIdempotent
Inspect

Reads design data of the active site: templates and their variables, template backups, menus, mail forms, site pages and the template guides. Does not change anything.

NameRequiredDescriptionDefault
pageNoList page, from 1.
actionYesOperation to run. Each oneOf entry describes one action and lists its parameters.
detailNoRecord form of a paged list. brief (default): for site pages id, title, status, parent id, public URL, last change and a plain-text excerpt up to 200 characters. Titles and excerpts are plain text; names, logins, paths, URLs and other identifiers are as the source gives them. full: complete records. A list reply is at most 30 KB and holds every record of its page: a record that does not fit in full comes in brief form, marked detail brief, the reply counts such records in brief_records, and get by id returns the complete record; brief records shorten their excerpts, then keep only their ids and titles. Only a page that does not fit even so is cut: truncated is true and next names the offset to go on from.
offsetNoRecords to skip from the start of a list; overrides page. A list reply cut at its size limit names the offset that follows in next.
contentNoGlobal block HTML (gblock_create) or full template body to check (validate_template; html_content is accepted too).
menu_idNoMenu id from menu_list.
page_idNoSite page id. Page 1 cannot be deleted.
per_pageNoRecords per page: 1-50, 20 by default, larger values count as 50.
module_idNoNumeric module id of the template, from list_modules.
page_pageNopage_list: the earlier name of page; page wins when both are set.
code_pasteNoReplacement for code_search; an empty string deletes the fragment.
code_searchNoExact template fragment to find.
template_idNoTemplate id within the module, from list_modules.
html_contentNoFull template HTML. For small edits use patch_template.
mail_form_idNoMail form id from mail_list_forms.
page_per_pageNopage_list: the earlier name of per_page; per_page wins when both are set.

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, destructiveHint=false and idempotentHint, and "Does not change anything" merely restates that safety profile. No additional behavioral context (pagination/size limits, that validate_template performs no save, that 30 KB list truncation occurs) appears in the description — that detail lives only in the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the resource scope and closed with the side-effect guarantee. Nothing is padded and the reader learns the domain in the first clause.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a sixteen-action multiplexer the description correctly identifies the breadth of coverage, and the oneOf schema entries carry the per-action contracts. What is missing is only the connective guidance (which sibling read tool to prefer, site-selection prerequisite), so it is close to sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds no parameter meaning of its own; all sixteen parameters, including the action enum and its per-action requirements, are documented at 100% coverage in the schema. Baseline 3 applies since the schema does all the work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

A specific verb ("Reads") plus a concrete resource set: templates, backups, menus, mail forms, site pages, guides. The enumeration makes the tool's coverage unambiguous and clearly separates it from templates_write/templates_delete. It stops short of differentiating from adjacent read tools such as modules_read or tmaker_read, which also touch design data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by the enumeration of resource families; there is no explicit statement of when to pick this over modules_read or tmaker_read, nor any prerequisite (e.g. site must be selected/active). The 'active site' phrase hints at a required context but doesn't state it as a condition.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

templates_writeEdit site designA
Destructive
Inspect

Creates and edits design data of the active site: templates (full replace or fragment patch), template backups, global blocks, menus, mail forms and their fields, site pages.

NameRequiredDescriptionDefault
idNoGlobal block id (synonym for gblock_id).
pdaNoMobile (PDA) version flag of a global block.
itemsNoMenu items tree; replaces the current items. Item fields: title (item text), url, target, class, children; other keys are refused.
titleNoMenu title.
actionYesOperation to run. Each oneOf entry describes one action and lists its parameters.
layoutNoMenu layout: 0 horizontal, 1 vertical.
contentNoGlobal block HTML (gblock_create) or full template body to check (validate_template; html_content is accepted too).
menu_idNoMenu id from menu_list.
page_idNoSite page id. Page 1 cannot be deleted.
mail_rezNoMessage shown after the form is sent.
gblock_idNoGlobal block id.
mail_nameNoMail form name, or field label for field actions.
mail_tmplNoHTML template of the notification email.
module_idNoNumeric module id of the template, from list_modules.
page_nameNoPage title.
page_tmplNoCode of the page own template.
code_pasteNoReplacement for code_search; an empty string deletes the fragment.
code_searchNoExact template fragment to find.
mail_emailsNoRecipient emails (string or array).
mail_valuesNoOptions of a select or radio field.
page_other1NoExtra field 1.
page_other2NoExtra field 2.
page_other3NoExtra field 3.
page_other4NoExtra field 4.
page_other5NoExtra field 5.
page_ownurlNoCustom URL slug.
template_idNoTemplate id within the module, from list_modules.
html_contentNoFull template HTML. For small edits use patch_template.
mail_form_idNoMail form id from mail_list_forms.
page_messageNoPage HTML content. It is saved as HTML whatever editor the site uses.
page_owntmplNoUse the page own template.
page_pendingNoPending (moderation) flag.
mail_field_idNoMail form field id from mail_list_fields.
mail_requiredNoThe field must be filled in.
mail_directionNo0 moves the field up, any other value moves it down.
page_parent_idNoParent page id.
mail_field_typeNoMail form field type code.
page_access_allNoPage is visible to all groups.
page_meta_titleNoSEO title.
page_meta_keywordsNoSEO keywords.
page_meta_descriptionNoSEO description.

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=true and openWorldHint=true, so the safety profile is covered. The description adds mutation scope (it writes live design data of the active site) but does not mention the automatic rotated backup, the LIMIT_REACHED refusal, or ALREADY_EXISTS conflicts — those important behavioral details live only in the schema's oneOf entries, not in the description.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler, and the resource enumeration is a compact way to convey the tool's breadth. It is slightly list-heavy but every clause maps to a real action family.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 41-parameter, 15-action multiplexer with no output schema, the description stays minimal because the action enum's oneOf entries do the heavy lifting (required fields, backup behavior, error codes). What is missing from the description itself is a warning that operations act on the currently selected site and that most writes are destructive — but the annotations and schema largely compensate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the action enum's oneOf entries document required/optional parameters per action in detail, so the schema carries the burden. The description only contributes the '(full replace or fragment patch)' framing for the two template actions; it does not explain the action multiplexing or the id/gblock_id synonym.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb pair ('Creates and edits') plus the concrete resources it touches (templates, backups, global blocks, menus, mail forms, pages) and scopes it to the 'active site'. It does not name the sibling tools it competes with (templates_read, templates_delete), so an agent must infer the read/delete split from names alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: it is clearly the write-side counterpart to templates_read, and the parenthetical '(full replace or fragment patch)' hints at choosing between the two template actions. There is no explicit when-to-use/when-not, no prerequisite (select_site, list_modules) guidance, and no routing advice for the 15 action values.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tmaker_deleteDelete Template Maker projectC
Destructive
Inspect

Deletes a saved Template Maker project.

NameRequiredDescriptionDefault
idNoSynonym for design_id or project_id.
actionYesOperation to run. Each oneOf entry describes one action and lists its parameters.
confirmYesPass true only after the user approves this change. Required by: project_delete.
project_idNoSaved project id from project_list.

TDQS

C2.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, readOnlyHint=false, openWorldHint=false, so the safety profile is known. The description adds nothing beyond that: it does not say the deletion is irreversible, what exactly is removed (project plus its pages/assets?), or how the required confirm flag gates execution.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler, which is structurally clean, but its brevity reflects under-specification rather than efficiency — nothing is said that the name and title do not already convey.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an irreversible destructive operation with four parameters (including a numeric/enum indirection between id and project_id), the description omits irreversibility, confirmation semantics, and failure behavior. The rich schema mitigates this, but the description itself is too thin for the risk level.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, including the id/project_id synonym relationship and the confirm approval requirement, so the schema does the heavy lifting. The description contributes no additional parameter meaning, making the baseline 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Deletes a saved Template Maker project"), but it is essentially a restatement of the title and adds no differentiation from the many sibling delete tools (templates_delete, apps_delete, content_delete, etc.). An agent cannot tell from the description alone how this differs from templates_delete.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus tmaker_write or templates_delete, and no mention of prerequisites such as needing a project_id from tmaker_read/project_list or user approval before proceeding. The only 'when' information lives in the schema's confirm description, not the tool description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tmaker_publishPublish site skeletonA
Destructive
Inspect

Publishes skeleton HTML to the active site and replaces all of its templates. Changes the look of the whole public site.

NameRequiredDescriptionDefault
pdaNoPublish the mobile (PDA) skeleton instead of the desktop one.
tmplYesSkeleton HTML.
actionYesOperation to run. Each oneOf entry describes one action and lists its parameters.
confirmYesPass true only after the user approves this change. Required by: skeleton_publish.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and openWorldHint=true, so the description isn't carrying the safety burden alone. It still adds real blast-radius context beyond the annotations: all templates are replaced and the entire public site's appearance changes. It does not mention the automatic backup/refusal behavior, but that is documented in the action enum description.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, zero filler, and the destructive scope is front-loaded before the user-facing consequence. Nothing is repeated from the name or title alone.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, open-world publish with no output schema, the description covers what is changed and how broadly. The remaining operational details (backup, refusal on backup failure, confirm approval) are fully specified in the schema, so the description is nearly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and every parameter (pda, tmpl, action, confirm) is documented in-schema, including the backup-and-refusal semantics and the confirm approval rule. The description adds nothing parameter-specific, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: publishes skeleton HTML to the active site and replaces all its templates. The scope ('active site', 'all of its templates') distinguishes it from tmaker_write/templates_write, though it never names those siblings explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: the phrase 'Changes the look of the whole public site' signals this is a high-impact, site-wide operation, which helps an agent decide whether to reach for it. There is no explicit when-to-use/when-not or reference to tmaker_write versus this publish step, and the confirm-gating workflow appears only in the schema.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tmaker_readRead Template MakerA
Read-onlyIdempotent
Inspect

Reads Template Maker data: skeleton guide and placeholder rules, standard designs, saved projects. Validates skeleton HTML without saving it.

NameRequiredDescriptionDefault
idNoSynonym for design_id or project_id.
tmplNoSkeleton HTML.
actionYesOperation to run. Each oneOf entry describes one action and lists its parameters.
offsetNoRecords to skip from the start of a list; overrides page. A list reply cut at its size limit names the offset that follows in next.
design_idNoStandard design id from designs_list (usually 101 or more).
project_idNoSaved project id from project_list.

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is fully covered elsewhere. The only extra behavioral note is that skeleton validation does not persist anything ('without saving it'), but that same fact is already stated in the schema's skeleton_validate entry, so the description adds little beyond structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short, front-loaded sentences with no filler; the resource enumeration comes first and the validation caveat second. It is efficient, though it could have traded one clause for an explicit routing hint to the write/delete siblings.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 100% schema coverage, an output-schema-free design, and annotations covering read-only/idempotency, the description is nearly complete for a multi-action read tool. The remaining gap is routing guidance to sibling mutation tools and pagination behavior, both of which are only partly addressed elsewhere.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the action enum documents each operation along with its required id/tmpl/offset parameters. The description names the data categories but supplies no syntax, defaults, or id-source detail beyond what the schema already gives, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb (reads) plus the concrete resource groups it exposes: skeleton guide, placeholder rules, standard designs, saved projects, and skeleton validation. An agent can distinguish it from tmaker_write/tmaker_delete/tmaker_publish by the read/validate framing, though it never explicitly names those siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by the word 'Reads' and by the per-action oneOf descriptions in the schema; the description itself offers no when-to-use, when-not-to-use, or explicit alternative (e.g. use tmaker_write to modify a project).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tmaker_writeSave Template Maker projectA
Destructive
Inspect

Saves Template Maker projects. Builds a ZIP archive of skeleton HTML with its stylesheet and images, downloading external ones from the addresses in the HTML and CSS, and puts it in the public root of the site. Site templates are not changed.

NameRequiredDescriptionDefault
tmplYesSkeleton HTML.
actionYesOperation to run. Each oneOf entry describes one action and lists its parameters.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already disclose destructive=true, openWorld=true, and readOnly=false. The description adds useful behavioral context beyond annotations: it downloads external stylesheet and image resources from URLs embedded in HTML/CSS, writes a ZIP archive to the public root, and does not alter site templates. It stops short of explaining overwrite behavior or active-project semantics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded, three sentences, and every sentence contributes: the primary purpose, the archive-building behavior, and the scope exclusion. There is no redundant or filler content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter tool with full schema coverage and rich annotations, the description covers the main behavioral traits: saving, ZIP creation, external downloads, public-root placement, and unchanged site templates. It does not clarify the return value for skeleton_archive or overwrite behavior for project_save, leaving minor gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the action enum includes detailed oneOf descriptions for each operation. The description adds no parameter-specific guidance beyond what the schema already provides, so it meets the baseline but does not enrich parameter meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool saves Template Maker projects and builds a ZIP archive of skeleton HTML with assets. It also clarifies that site templates are not changed, which distinguishes it from template-editing tools. However, it does not explicitly distinguish its three actions from siblings like tmaker_publish or tmaker_delete.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool by describing save and archive behavior, and 'Site templates are not changed' provides a limited exclusion. However, it does not name alternatives such as tmaker_publish or explain when to choose project_save versus skeleton_archive beyond what the schema already says.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

users_deleteDelete usersB
Destructive
Inspect

Deletes a user or a user group; group members are moved to the target group.

NameRequiredDescriptionDefault
idNoGroup id.
gidNoGroup id. On group actions it is a synonym for id.
nidNoGroup that receives the members of a deleted group.
nickNoUser login (nick), 2-25 characters. Synonym: user.
userNoSynonym for nick.
actionYesOperation to run. Each oneOf entry describes one action and lists its parameters.
confirmYesPass true only after the user approves this change. Required by: delete, group_delete.

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is covered. The description adds meaningful behavior beyond annotations — that group members are moved to the target group rather than deleted — which is genuinely useful context. It stops short of noting that deletion is irreversible or that confirm must be true.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single compact sentence with zero waste, front-loading the core action and then the notable side effect on group members.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive tool with full schema coverage and annotations carrying the safety profile, the description supplies the key non-obvious behavior (member relocation). It doesn't restate the two-action enum logic or confirm requirement, but those are well covered by the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so parameters are fully documented in the schema, warranting the baseline of 3. The description's reference to 'the target group' loosely maps to nid but adds no syntax or format detail beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Deletes') and resources ('a user or a user group'), making the dual scope clear. It does not explicitly differentiate from the sibling users_write, but the delete verb sufficiently separates it from users_read/users_write.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to choose users_delete versus users_write (which might also handle removal/updating), and no mention of prerequisites such as the confirm flag or approval flow beyond what the schema says. Usage is only implied by the verb.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

users_readRead usersC
Read-onlyIdempotent
Inspect

Reads site users and profiles, user groups, group permissions, ranks and profile fields.

NameRequiredDescriptionDefault
idNoGroup id.
gidNoGroup id. On group actions it is a synonym for id.
nickNoUser login (nick), 2-25 characters. Synonym: user.
pageNoList page, from 1.
userNoSynonym for nick.
emailNoUser email.
actionYesOperation to run. Each oneOf entry describes one action and lists its parameters.
detailNoRecord form of a paged list. brief (default): id, login, full name, email, group, status (active or banned) and registration date (UTC, ISO 8601). Titles and excerpts are plain text; names, logins, paths, URLs and other identifiers are as the source gives them. full: complete records. A list reply is at most 30 KB and holds every record of its page: a record that does not fit in full comes in brief form, marked detail brief, the reply counts such records in brief_records, and get by id returns the complete record; brief records shorten their excerpts, then keep only their ids and titles. Only a page that does not fit even so is cut: truncated is true and next names the offset to go on from.
offsetNoRecords to skip from the start of a list; overrides page. A list reply cut at its size limit names the offset that follows in next.
user_idNoNumeric user id.
per_pageNoRecords per page: 1-50, 20 by default, larger values count as 50.

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so safety is covered. The description adds no behavioral context beyond the resource list — nothing about per-action required parameters, pagination/size-limit behavior (which sits in the schema), or what a caller gets back per action.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence naming verb and resources, with no filler. It is efficient, though for an 11-parameter, 8-action tool the brevity edges toward under-specification.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a multi-action read tool with no output schema, the description should at minimum flag the action-dispatch model and that required parameters vary per action. The rich enum descriptions compensate substantially, but the top-level description leaves the agent to discover the dispatch contract from the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the action enum documents each operation and its parameters in detail, so the schema carries the full burden. The description contributes nothing to parameter meaning; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Reads) and enumerates the resources covered: site users and profiles, user groups, group permissions, ranks and profile fields. It is clear enough to distinguish the read surface from users_write/users_delete by name, but it never says the tool is action-dispatched, so an agent cannot tell from the description alone that one call must pick among list/get/groups/ranks/fields.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no alternatives named, and no statement that this is the read counterpart to users_write/users_delete. Any routing information lives in the action enum descriptions, not in the tool description itself.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

users_writeEdit usersA
Destructive
Inspect

Creates and updates users and user groups: profile data, login, password, group membership and group permissions.

NameRequiredDescriptionDefault
idNoGroup id.
gidNoGroup id. On group actions it is a synonym for id.
nameNoFull name of a user, 3-35 characters, or the name of a group.
nickNoUser login (nick), 2-25 characters. Synonym: user.
userNoSynonym for nick.
emailNoUser email.
loginNoNew login.
actionYesOperation to run. Each oneOf entry describes one action and lists its parameters.
fieldsNoExtra profile fields of a user, or permissions of a group. Group permission codes come from groups_rights and group_permissions.
confirmNoPass true only after the user approves this change. Required by: chpass.
user_idNoNumeric user id.
passwordNoUser password: only Latin letters, digits, _ and -; 4-15 characters for add, 2-15 for chpass.

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=true and openWorldHint=true, so the risk profile is structured. The description adds the breadth of what is mutated (including group permissions) but says nothing about irreversibility, permission requirements, or the approval flow for password changes beyond what the schema states.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence that enumerates scope without filler. Every clause earns its place by naming a distinct thing that can be written.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 12-parameter, nested, destructive multi-action mutation tool with no output schema, the description is thin: it doesn't explain that the tool dispatches to eight distinct operations, nor what a caller should expect on failure. The rich action enum description compensates heavily, making this barely adequate rather than clearly insufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and each action's required/optional parameters are documented in the enum's oneOf descriptions, so the schema does the work. The description's phrase 'group permissions' hints that permission codes travel via fields, but it adds little beyond that mapping.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb pair ('Creates and updates') and enumerates the resources covered: user profile data, login, password, group membership and group permissions. That scope, plus the name, cleanly separates it from users_read and users_delete without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to reach for it (any create/modify operation on users or groups) but never states exclusions or points to an alternative for reads or deletions. Action-level usage rules live entirely in the schema's oneOf entries, not in the description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 1 tool update
    • Changedskills_tool2 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"resolve: max alternatives (1–7, default 3)."New value: +"resolve: how many matching skills to return, the primary one included (default 3, up to the whole catalog)."
      • changedInput schema / properties / task / description
        Previous value: -"resolve: user task wording."New value: +"resolve: user task wording (the first 2000 characters are matched)."
  2. 1 tool update
    • Changedsettings_write1 field changed
      • changedInput schema / properties / action / oneOf
        Previous value: -[
        -  {
        -    "const": "settings_update",
        -    "description": "Changes only the passed keys of the settings of a module. The result lists changed keys (before and after) and unchanged keys: an unchanged key was unknown, already set, or clamped by the module; access keys are shown only as (set) or empty. confirm is required (not for a dry run) to turn on users reinstall_popup_templates or mass_mail, forum reset_visitor_record, site availability_closed, seo seo_DisableIndexing; to turn off users awards_enabled (deletes all awards), shop search_log_history (drops the search log), or options_other_categories of blog, news, board, publ, load, dir, stuff (removes entries from their additional categories); to change shop cart_invoice_next_number; and to pass users registration_allow_unet or registration_allow_local (can switch registration from uID to local users for good). These keys take a plain value, not an object or a list. A key passed both flat and nested is refused. Required: module, values. Optional: dry_run, confirm."
        -  }
        -]New value: +[
        +  {
        +    "const": "settings_update",
        +    "description": "Changes only the passed keys of the settings of a module. The result lists changed keys (before and after) and unchanged keys: an unchanged key was unknown, already set, or clamped by the module; access keys are shown only as (set) or empty. warnings, when present, lists the passed values the module ignored. confirm is required (not for a dry run) to turn on users reinstall_popup_templates or mass_mail, forum reset_visitor_record, site availability_closed, seo seo_DisableIndexing; to turn off users awards_enabled (deletes all awards), shop search_log_history (drops the search log), or options_other_categories of blog, news, board, publ, load, dir, stuff (removes entries from their additional categories); to change shop cart_invoice_next_number; and to pass users registration_allow_unet or registration_allow_local (can switch registration from uID to local users for good). These keys take a plain value, not an object or a list. A key passed both flat and nested is refused. Required: module, values. Optional: dry_run, confirm."
        +  }
        +]
  3. 18 tool updates
    • Changedapps_delete1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "action"
        -]New value: +[
        +  "action",
        +  "confirm"
        +]
    • Changedapps_write4 fields changed
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "ensure_ready",
        -  "activate",
        -  "switch_domain",
        -  "php_set_version",
        -  "selector_change",
        -  "node_create",
        -  "node_start",
        -  "node_stop",
        -  "node_restart",
        -  "node_install_modules",
        -  "python_create",
        -  "python_start",
        -  "python_stop",
        -  "python_restart",
        -  "python_install_modules",
        -  "files_write",
        -  "files_patch",
        -  "files_legacy_edit",
        -  "files_mkdir",
        -  "files_copy",
        -  "files_copy_to",
        -  "files_move",
        -  "files_move_to",
        -  "files_chmod",
        -  "files_archive",
        -  "files_extract",
        -  "files_publish",
        -  "files_download_archive",
        -  "db_create",
        -  "db_create_user",
        -  "db_create_with_user",
        -  "db_change_password",
        -  "db_change_hosts",
        -  "db_change_privs",
        -  "db_import",
        -  "db_export",
        -  "phpmyadmin",
        -  "ftp_create",
        -  "ftp_modify",
        -  "ftp_passwd",
        -  "cron_create",
        -  "backup_create",
        -  "backup_publish",
        -  "login_key_get",
        -  "login_key_create",
        -  "login_key_rotate",
        -  "da_login_key_create",
        -  "da_login_key_patch",
        -  "visitor_key_get",
        -  "visitor_key_create",
        -  "visitor_key_rotate"
        -]New value: +[
        +  "ensure_ready",
        +  "activate",
        +  "switch_domain",
        +  "php_set_version",
        +  "selector_change",
        +  "node_create",
        +  "node_start",
        +  "node_stop",
        +  "node_restart",
        +  "node_install_modules",
        +  "python_create",
        +  "python_start",
        +  "python_stop",
        +  "python_restart",
        +  "python_install_modules",
        +  "files_write",
        +  "files_patch",
        +  "files_legacy_edit",
        +  "files_mkdir",
        +  "files_copy",
        +  "files_copy_to",
        +  "files_move",
        +  "files_move_to",
        +  "files_chmod",
        +  "files_archive",
        +  "files_extract",
        +  "files_publish",
        +  "files_download_archive",
        +  "db_create",
        +  "db_create_user",
        +  "db_create_with_user",
        +  "db_change_password",
        +  "db_change_hosts",
        +  "db_change_privs",
        +  "db_import",
        +  "db_export",
        +  "phpmyadmin",
        +  "ftp_create",
        +  "ftp_passwd",
        +  "cron_create",
        +  "backup_create",
        +  "backup_publish",
        +  "login_key_get",
        +  "login_key_create",
        +  "login_key_rotate",
        +  "da_login_key_create",
        +  "da_login_key_patch",
        +  "visitor_key_get",
        +  "visitor_key_create",
        +  "visitor_key_rotate"
        +]
      • changedInput schema / properties / action / oneOf
        Previous value: -[
        -  {
        -    "const": "ensure_ready",
        -    "description": "Prepares the environment session: activates the account when needed (then confirm is required), creates the keys and returns username and selected_domain. Optional: confirm."
        -  },
        -  {
        -    "const": "activate",
        -    "description": "Creates the server scripts account of the site. Required: confirm."
        -  },
        -  {
        -    "const": "switch_domain",
        -    "description": "Switches the active environment domain. Required: domain, confirm."
        -  },
        -  {
        -    "const": "php_set_version",
        -    "description": "Sets the PHP version (8.2, 8.3 or native). Required: version."
        -  },
        -  {
        -    "const": "selector_change",
        -    "description": "Runs a language selector method that changes state: set, create, start, stop, restart or install-modules. Required: plugin, interpreter, selector_method. Optional: params."
        -  },
        -  {
        -    "const": "node_create",
        -    "description": "Creates a Node.js application in app_root, served at https://{site}/apps{app_uri}. Required: app_root. Optional: app_uri, version, domain, app_mode, startup_file, env_vars."
        -  },
        -  {
        -    "const": "node_start",
        -    "description": "Starts a Node.js application. Required: app_root."
        -  },
        -  {
        -    "const": "node_stop",
        -    "description": "Stops a Node.js application. Required: app_root."
        -  },
        -  {
        -    "const": "node_restart",
        -    "description": "Restarts a Node.js application. Required: app_root."
        -  },
        -  {
        -    "const": "node_install_modules",
        -    "description": "Installs the npm modules of a Node.js application. Required: app_root."
        -  },
        -  {
        -    "const": "python_create",
        -    "description": "Creates a Python application in app_root, served at https://{site}/apps{app_uri}. Required: app_root. Optional: app_uri, version, domain, startup_file, entry_point, env_vars."
        -  },
        -  {
        -    "const": "python_start",
        -    "description": "Starts a Python application. Required: app_root."
        -  },
        -  {
        -    "const": "python_stop",
        -    "description": "Stops a Python application. Required: app_root."
        -  },
        -  {
        -    "const": "python_restart",
        -    "description": "Restarts a Python application. Required: app_root."
        -  },
        -  {
        -    "const": "python_install_modules",
        -    "description": "Installs the pip modules of a Python application. Required: app_root."
        -  },
        -  {
        -    "const": "files_write",
        -    "description": "Writes a text file (overwrites by default). Required: path, content. Optional: overwrite."
        -  },
        -  {
        -    "const": "files_patch",
        -    "description": "Replaces old_string, which must occur exactly once, with new_string in a small text file. Required: path, old_string, new_string."
        -  },
        -  {
        -    "const": "files_legacy_edit",
        -    "description": "Edits a file through the legacy file manager command. Usually fails with a login key; files_write is the regular way. Required: path, content, confirm."
        -  },
        -  {
        -    "const": "files_mkdir",
        -    "description": "Creates a directory. Required: path."
        -  },
        -  {
        -    "const": "files_copy",
        -    "description": "Copies source (or path) to destination. Required: destination. Optional: source, path, overwrite."
        -  },
        -  {
        -    "const": "files_copy_to",
        -    "description": "Copies paths, sources, source or path into destination_dir. Optional: destination_dir, destination, paths, sources, source, path, merge."
        -  },
        -  {
        -    "const": "files_move",
        -    "description": "Moves source (or path) to destination. Required: destination, confirm. Optional: source, path, overwrite."
        -  },
        -  {
        -    "const": "files_move_to",
        -    "description": "Moves paths, sources, source or path into destination_dir. Required: confirm. Optional: destination_dir, destination, paths, sources, source, path, merge."
        -  },
        -  {
        -    "const": "files_chmod",
        -    "description": "Changes permissions of paths. Required: perm. Optional: paths, sources, source, path."
        -  },
        -  {
        -    "const": "files_archive",
        -    "description": "Creates an archive at destination from sources. Required: destination. Optional: paths, sources, source, path."
        -  },
        -  {
        -    "const": "files_extract",
        -    "description": "Extracts an archive into destination_dir; may overwrite files. Required: confirm. Optional: source, path, destination_dir, destination, members, merge."
        -  },
        -  {
        -    "const": "files_publish",
        -    "description": "Copies a file into a random public folder. The result is a public download URL (https://{site}/apps/_mcp_dl/...) in the technical domain public_html; delete stored_path with apps_delete files_delete afterwards. Optional: path, source."
        -  },
        -  {
        -    "const": "files_download_archive",
        -    "description": "Packs paths into a ZIP in a random public folder. The result is a public download URL (https://{site}/apps/_mcp_dl/...) in the technical domain public_html; delete stored_path with apps_delete files_delete afterwards. Optional: paths, sources, source, path."
        -  },
        -  {
        -    "const": "db_create",
        -    "description": "Creates a MySQL database; the name gets the {username}_ prefix. Optional: database, name, charset, collation."
        -  },
        -  {
        -    "const": "db_create_user",
        -    "description": "Creates a MySQL user; the name gets the {username}_ prefix. Required: password. Optional: dbuser, name, hosts."
        -  },
        -  {
        -    "const": "db_create_with_user",
        -    "description": "Creates a MySQL database and its user with full privileges; the password is returned once. Optional: database, name, dbuser, password, privileges, charset, collation, hosts."
        -  },
        -  {
        -    "const": "db_change_password",
        -    "description": "Changes the password of a MySQL user. Required: dbuser or name, new_password or password, confirm."
        -  },
        -  {
        -    "const": "db_change_hosts",
        -    "description": "Replaces the host patterns of a MySQL user. Required: dbuser or name, hosts, confirm."
        -  },
        -  {
        -    "const": "db_change_privs",
        -    "description": "Replaces the privileges of a MySQL user on a database. Required: database, dbuser, confirm. Optional: privileges."
        -  },
        -  {
        -    "const": "db_import",
        -    "description": "Opens a one-time phpMyAdmin sign-in session and returns its link to import a database dump; the SQL does not pass through MCP."
        -  },
        -  {
        -    "const": "db_export",
        -    "description": "Opens a one-time phpMyAdmin sign-in session and returns its link to export a database dump; the SQL does not pass through MCP."
        -  },
        -  {
        -    "const": "phpmyadmin",
        -    "description": "Opens a one-time phpMyAdmin sign-in session and returns its link."
        -  },
        -  {
        -    "const": "ftp_create",
        -    "description": "Creates an environment FTP account. Required: password. Optional: user, name, domain."
        -  },
        -  {
        -    "const": "ftp_modify",
        -    "description": "Changes an environment FTP account. Required: confirm. Optional: user, name, password, domain."
        -  },
        -  {
        -    "const": "ftp_passwd",
        -    "description": "Changes the password of an environment FTP account. Required: password, confirm. Optional: user, name, domain."
        -  },
        -  {
        -    "const": "cron_create",
        -    "description": "Creates a cron job (default schedule: minute 0 of every hour). Required: command. Optional: minute, hour, dayofmonth, month, dayofweek."
        -  },
        -  {
        -    "const": "backup_create",
        -    "description": "Queues a full environment backup; the file appears later under backups/. Required: confirm. Optional: parts, domain."
        -  },
        -  {
        -    "const": "backup_publish",
        -    "description": "Publishes a backup file backups/{file}. The result is a public download URL (https://{site}/apps/_mcp_dl/...) in the technical domain public_html; delete stored_path with apps_delete files_delete afterwards. Required: path."
        -  },
        -  {
        -    "const": "login_key_get",
        -    "description": "Returns one login key with its secret value (default main; the value of main is stored for this site and not returned). Optional: key_id, id."
        -  },
        -  {
        -    "const": "login_key_create",
        -    "description": "Creates a login key record (default main; the value of main is stored for this site and not returned). Optional: key_id, id."
        -  },
        -  {
        -    "const": "login_key_rotate",
        -    "description": "Replaces the value of a login key; the old value stops working. Required: confirm. Optional: key_id, id."
        -  },
        -  {
        -    "const": "da_login_key_create",
        -    "description": "Creates a panel login key; allow_login=true also requires confirm. Required: key_id or id, password. Optional: allow_login, allow_commands, deny_commands, allow_networks, current_password, confirm."
        -  },
        -  {
        -    "const": "da_login_key_patch",
        -    "description": "Changes a panel login key. Required: key_id or id, confirm. Optional: password, allow_login, allow_commands, deny_commands, allow_networks, current_password."
        -  },
        -  {
        -    "const": "visitor_key_get",
        -    "description": "Returns the visitor encryption key with its secret value."
        -  },
        -  {
        -    "const": "visitor_key_create",
        -    "description": "Creates the visitor encryption key."
        -  },
        -  {
        -    "const": "visitor_key_rotate",
        -    "description": "Replaces the visitor encryption key; existing scripts stop decrypting old visitor data. Required: confirm."
        -  }
        -]New value: +[
        +  {
        +    "const": "ensure_ready",
        +    "description": "Prepares the environment session: activates the account when needed (then confirm is required), creates the keys and returns username and selected_domain. Optional: confirm."
        +  },
        +  {
        +    "const": "activate",
        +    "description": "Creates the server scripts account of the site. Required: confirm."
        +  },
        +  {
        +    "const": "switch_domain",
        +    "description": "Switches the active environment domain. Required: domain, confirm."
        +  },
        +  {
        +    "const": "php_set_version",
        +    "description": "Sets the PHP version (8.2, 8.3 or native). Required: version."
        +  },
        +  {
        +    "const": "selector_change",
        +    "description": "Runs a language selector method that changes state: set, create, start, stop, restart or install-modules. Required: plugin, interpreter, selector_method. Optional: params."
        +  },
        +  {
        +    "const": "node_create",
        +    "description": "Creates a Node.js application in app_root, served at https://{site}/apps{app_uri}. Required: app_root. Optional: app_uri, version, domain, app_mode, startup_file, env_vars."
        +  },
        +  {
        +    "const": "node_start",
        +    "description": "Starts a Node.js application. Required: app_root."
        +  },
        +  {
        +    "const": "node_stop",
        +    "description": "Stops a Node.js application. Required: app_root."
        +  },
        +  {
        +    "const": "node_restart",
        +    "description": "Restarts a Node.js application. Required: app_root."
        +  },
        +  {
        +    "const": "node_install_modules",
        +    "description": "Installs the npm modules of a Node.js application. Required: app_root."
        +  },
        +  {
        +    "const": "python_create",
        +    "description": "Creates a Python application in app_root, served at https://{site}/apps{app_uri}. Required: app_root. Optional: app_uri, version, domain, startup_file, entry_point, env_vars."
        +  },
        +  {
        +    "const": "python_start",
        +    "description": "Starts a Python application. Required: app_root."
        +  },
        +  {
        +    "const": "python_stop",
        +    "description": "Stops a Python application. Required: app_root."
        +  },
        +  {
        +    "const": "python_restart",
        +    "description": "Restarts a Python application. Required: app_root."
        +  },
        +  {
        +    "const": "python_install_modules",
        +    "description": "Installs the pip modules of a Python application. Required: app_root."
        +  },
        +  {
        +    "const": "files_write",
        +    "description": "Writes a text file (overwrites by default). Required: path, content. Optional: overwrite."
        +  },
        +  {
        +    "const": "files_patch",
        +    "description": "Replaces old_string, which must occur exactly once, with new_string in a small text file. Required: path, old_string, new_string."
        +  },
        +  {
        +    "const": "files_legacy_edit",
        +    "description": "Edits a file through the legacy file manager command. Usually fails with a login key; files_write is the regular way. Required: path, content, confirm."
        +  },
        +  {
        +    "const": "files_mkdir",
        +    "description": "Creates a directory. Required: path."
        +  },
        +  {
        +    "const": "files_copy",
        +    "description": "Copies source (or path) to destination. Required: destination. Optional: source, path, overwrite."
        +  },
        +  {
        +    "const": "files_copy_to",
        +    "description": "Copies paths, sources, source or path into destination_dir. Optional: destination_dir, destination, paths, sources, source, path, merge."
        +  },
        +  {
        +    "const": "files_move",
        +    "description": "Moves source (or path) to destination. Required: destination, confirm. Optional: source, path, overwrite."
        +  },
        +  {
        +    "const": "files_move_to",
        +    "description": "Moves paths, sources, source or path into destination_dir. Required: confirm. Optional: destination_dir, destination, paths, sources, source, path, merge."
        +  },
        +  {
        +    "const": "files_chmod",
        +    "description": "Changes permissions of paths. Required: perm. Optional: paths, sources, source, path."
        +  },
        +  {
        +    "const": "files_archive",
        +    "description": "Creates an archive at destination from sources. Required: destination. Optional: paths, sources, source, path."
        +  },
        +  {
        +    "const": "files_extract",
        +    "description": "Extracts an archive into destination_dir; may overwrite files. Required: confirm. Optional: source, path, destination_dir, destination, members, merge."
        +  },
        +  {
        +    "const": "files_publish",
        +    "description": "Copies a file into a random public folder. The result is a public download URL (https://{site}/apps/_mcp_dl/...) in the technical domain public_html; delete stored_path with apps_delete files_delete afterwards. Optional: path, source."
        +  },
        +  {
        +    "const": "files_download_archive",
        +    "description": "Packs paths into a ZIP in a random public folder. The result is a public download URL (https://{site}/apps/_mcp_dl/...) in the technical domain public_html; delete stored_path with apps_delete files_delete afterwards. Optional: paths, sources, source, path."
        +  },
        +  {
        +    "const": "db_create",
        +    "description": "Creates a MySQL database; the name gets the {username}_ prefix. Optional: database, name, charset, collation."
        +  },
        +  {
        +    "const": "db_create_user",
        +    "description": "Creates a MySQL user; the name gets the {username}_ prefix. The password needs at least 8 characters. The reply does not repeat the password. Required: password. Optional: dbuser, name, hosts."
        +  },
        +  {
        +    "const": "db_create_with_user",
        +    "description": "Creates a MySQL database and its user with full privileges. Without password the environment generates one and the reply returns it once (password_once); a password passed in the call needs at least 8 characters and is not repeated in the reply. Optional: database, name, dbuser, password, privileges, charset, collation, hosts."
        +  },
        +  {
        +    "const": "db_change_password",
        +    "description": "Changes the password of a MySQL user after the user approves it; the old password stops working. The reply does not repeat the password. Required: dbuser or name, new_password or password, confirm."
        +  },
        +  {
        +    "const": "db_change_hosts",
        +    "description": "Replaces the host patterns of a MySQL user. Required: dbuser or name, hosts, confirm."
        +  },
        +  {
        +    "const": "db_change_privs",
        +    "description": "Replaces the privileges of a MySQL user on a database. Required: database, dbuser, confirm. Optional: privileges."
        +  },
        +  {
        +    "const": "db_import",
        +    "description": "Opens a one-time phpMyAdmin sign-in session and returns its link to import a database dump; the SQL does not pass through MCP."
        +  },
        +  {
        +    "const": "db_export",
        +    "description": "Opens a one-time phpMyAdmin sign-in session and returns its link to export a database dump; the SQL does not pass through MCP."
        +  },
        +  {
        +    "const": "phpmyadmin",
        +    "description": "Opens a one-time phpMyAdmin sign-in session and returns its link."
        +  },
        +  {
        +    "const": "ftp_create",
        +    "description": "Creates an environment FTP account (not the FTP of the uCoz site) after the user approves it. Its folder is the root folder of the domain, and anyone who has its password can sign in over FTP. The password needs at least 8 characters. The reply has the login and the folder. The reply does not repeat the password. Required: password, confirm. Optional: user, name, domain."
        +  },
        +  {
        +    "const": "ftp_passwd",
        +    "description": "Replaces the password of an environment FTP account from ftp_list after the user approves it; the old password stops working and the folder stays. The password needs at least 8 characters. The main account of the environment is not changed here. The reply does not repeat the password. Required: password, confirm. Optional: user, name, domain."
        +  },
        +  {
        +    "const": "cron_create",
        +    "description": "Creates a cron job (default schedule: minute 0 of every hour). Required: command. Optional: minute, hour, dayofmonth, month, dayofweek."
        +  },
        +  {
        +    "const": "backup_create",
        +    "description": "Queues a full environment backup; the file appears later under backups/. Required: confirm. Optional: parts, domain."
        +  },
        +  {
        +    "const": "backup_publish",
        +    "description": "Publishes a backup file backups/{file}. The result is a public download URL (https://{site}/apps/_mcp_dl/...) in the technical domain public_html; delete stored_path with apps_delete files_delete afterwards. Required: path."
        +  },
        +  {
        +    "const": "login_key_get",
        +    "description": "Returns one login key record (default main): id, creation date and whether uCoz stores its value (value_known). The key value is not returned: the user can see and copy it in the site control panel, Server scripts section, API keys tab. The value of main is kept by MCP for this site. When value_known is false, uCoz does not store the value and the control panel cannot show it; login_key_rotate sets a new value it shows. Optional: key_id, id."
        +  },
        +  {
        +    "const": "login_key_create",
        +    "description": "Creates a login key (default main). The key value is not returned: the user can see and copy it in the site control panel, Server scripts section, API keys tab. The value of main is kept by MCP for this site. Optional: key_id, id."
        +  },
        +  {
        +    "const": "login_key_rotate",
        +    "description": "Replaces the value of a login key; the old value stops working. The key value is not returned: the user can see and copy it in the site control panel, Server scripts section, API keys tab. The value of main is kept by MCP for this site. Required: confirm. Optional: key_id, id."
        +  },
        +  {
        +    "const": "da_login_key_create",
        +    "description": "Creates a panel login key; allow_login=true also requires confirm. Required: key_id or id, password. Optional: allow_login, allow_commands, deny_commands, allow_networks, current_password, confirm."
        +  },
        +  {
        +    "const": "da_login_key_patch",
        +    "description": "Changes a panel login key. Required: key_id or id, confirm. Optional: password, allow_login, allow_commands, deny_commands, allow_networks, current_password."
        +  },
        +  {
        +    "const": "visitor_key_get",
        +    "description": "Tells whether the visitor data encryption key is set (present). The key value is not returned: uCoz delivers the key to the environment by itself and scripts read it there, so it never has to be copied. The site control panel does not show it either."
        +  },
        +  {
        +    "const": "visitor_key_create",
        +    "description": "Creates the visitor data encryption key. The key value is not returned: uCoz delivers the key to the environment by itself and scripts read it there, so it never has to be copied. The site control panel does not show it either."
        +  },
        +  {
        +    "const": "visitor_key_rotate",
        +    "description": "Replaces the visitor data encryption key; existing scripts stop decrypting old visitor data. The key value is not returned: uCoz delivers the key to the environment by itself and scripts read it there, so it never has to be copied. The site control panel does not show it either. Required: confirm."
        +  }
        +]
      • changedInput schema / properties / confirm / description
        Previous value: -"Pass true only after the user approves this change. Required by: activate, switch_domain, files_legacy_edit, files_move, files_move_to, files_extract, db_change_password, db_change_hosts, db_change_privs, ftp_modify, ftp_passwd, backup_create, login_key_rotate, da_login_key_patch, visitor_key_rotate. Required in some cases by: ensure_ready, da_login_key_create (see the action)."New value: +"Pass true only after the user approves this change. Required by: activate, switch_domain, files_legacy_edit, files_move, files_move_to, files_extract, db_change_password, db_change_hosts, db_change_privs, ftp_create, ftp_passwd, backup_create, login_key_rotate, da_login_key_patch, visitor_key_rotate. Required in some cases by: ensure_ready, da_login_key_create (see the action)."
      • changedInput schema / properties / password / description
        Previous value: -"Password for a new DB user, FTP account, or panel login key. Omit to let the environment generate a DB password."New value: +"Password for a new DB user, FTP account, or panel login key; at least 8 characters for FTP and DB users. Omit to let the environment generate a DB password."
    • Changedcontent_delete1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "action"
        -]New value: +[
        +  "action",
        +  "module",
        +  "confirm"
        +]
    • Changedcontent_write1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "action"
        -]New value: +[
        +  "action",
        +  "module"
        +]
    • Changedfiles_delete1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "action"
        -]New value: +[
        +  "action",
        +  "confirm"
        +]
    • Changedforum_delete1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "action"
        -]New value: +[
        +  "action",
        +  "confirm"
        +]
    • Addedftp_delete
    • Addedftp_read
    • Removedftp_tool
    • Addedftp_write
    • Changedmodules_uninstall1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "action"
        -]New value: +[
        +  "action",
        +  "module_code",
        +  "confirm"
        +]
    • Changedsettings_write1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "action"
        -]New value: +[
        +  "action",
        +  "module",
        +  "values"
        +]
    • Changedsubscriptions_delete1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "action"
        -]New value: +[
        +  "action",
        +  "confirm"
        +]
    • Changedtemplates_delete1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "action"
        -]New value: +[
        +  "action",
        +  "confirm"
        +]
    • Changedtmaker_delete1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "action"
        -]New value: +[
        +  "action",
        +  "confirm"
        +]
    • Changedtmaker_publish1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "action"
        -]New value: +[
        +  "action",
        +  "tmpl",
        +  "confirm"
        +]
    • Changedtmaker_write1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "action"
        -]New value: +[
        +  "action",
        +  "tmpl"
        +]
    • Changedusers_delete1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "action"
        -]New value: +[
        +  "action",
        +  "confirm"
        +]
  4. 22 tool updates
    • Changedapps_delete3 fields changed
      • changedInput schema / properties / action / oneOf
        Previous value: -[
        -  {
        -    "const": "node_destroy",
        -    "description": "Destroys a Node.js application. Required: app_root, confirm."
        -  },
        -  {
        -    "const": "python_destroy",
        -    "description": "Destroys a Python application. Required: app_root, confirm."
        -  },
        -  {
        -    "const": "selector_destroy",
        -    "description": "Runs the destroy method of a language selector. Required: plugin, interpreter, confirm. Optional: params."
        -  },
        -  {
        -    "const": "files_delete",
        -    "description": "Deletes paths, sources, source or path. Required: confirm. Optional: paths, sources, source, path, trash."
        -  },
        -  {
        -    "const": "db_delete",
        -    "description": "Deletes a MySQL database (name in database or name). Required: confirm. Optional: database, name."
        -  },
        -  {
        -    "const": "db_delete_user",
        -    "description": "Deletes a MySQL user (name in dbuser or name). Required: confirm. Optional: dbuser, name."
        -  },
        -  {
        -    "const": "ftp_delete",
        -    "description": "Deletes an environment FTP account (short username from ftp_list in select0, user or name). Required: confirm. Optional: select0, user, name, domain."
        -  },
        -  {
        -    "const": "cron_delete",
        -    "description": "Deletes cron jobs by cron_id (or cron_ids) from cron_list. Required: confirm. Optional: cron_id, cron_ids, select0."
        -  },
        -  {
        -    "const": "login_key_delete",
        -    "description": "Deletes a login key record (default main). Required: confirm. Optional: key_id, id."
        -  },
        -  {
        -    "const": "da_login_key_delete",
        -    "description": "Deletes a panel login key. Required: key_id, confirm. Optional: id."
        -  },
        -  {
        -    "const": "visitor_key_delete",
        -    "description": "Deletes the visitor encryption key. Required: confirm."
        -  }
        -]New value: +[
        +  {
        +    "const": "node_destroy",
        +    "description": "Destroys a Node.js application. Required: app_root, confirm."
        +  },
        +  {
        +    "const": "python_destroy",
        +    "description": "Destroys a Python application. Required: app_root, confirm."
        +  },
        +  {
        +    "const": "selector_destroy",
        +    "description": "Runs the destroy method of a language selector. Required: plugin, interpreter, confirm. Optional: params."
        +  },
        +  {
        +    "const": "files_delete",
        +    "description": "Deletes paths, sources, source or path. Required: confirm. Optional: paths, sources, source, path, trash."
        +  },
        +  {
        +    "const": "db_delete",
        +    "description": "Deletes a MySQL database (name in database or name). Required: database or name, confirm."
        +  },
        +  {
        +    "const": "db_delete_user",
        +    "description": "Deletes a MySQL user (name in dbuser or name). Required: dbuser or name, confirm."
        +  },
        +  {
        +    "const": "ftp_delete",
        +    "description": "Deletes an environment FTP account (short username from ftp_list in select0, user or name). Required: confirm. Optional: select0, user, name, domain."
        +  },
        +  {
        +    "const": "cron_delete",
        +    "description": "Deletes cron jobs by cron_id (or cron_ids) from cron_list. Required: confirm. Optional: cron_id, cron_ids, select0."
        +  },
        +  {
        +    "const": "login_key_delete",
        +    "description": "Deletes a login key record (default main). Required: confirm. Optional: key_id, id."
        +  },
        +  {
        +    "const": "da_login_key_delete",
        +    "description": "Deletes a panel login key. Required: key_id or id, confirm."
        +  },
        +  {
        +    "const": "visitor_key_delete",
        +    "description": "Deletes the visitor encryption key. Required: confirm."
        +  }
        +]
      • changedInput schema / properties / cron_id / description
        Previous value: -"Cron id from cron_list, for example 000. Sent as select0."New value: +"Id of a cron job: jobs[].id of cron_list, such as 000."
      • changedInput schema / properties / cron_ids / description
        Previous value: -"Several cron ids to delete (select0, select1, ...)."New value: +"Ids of several cron jobs to delete (jobs[].id of cron_list)."
    • Changedapps_read1 field changed
      • changedInput schema / properties / action / oneOf
        Previous value: -[
        -  {
        -    "const": "get_guide",
        -    "description": "Returns a step-by-step guide to the server environment."
        -  },
        -  {
        -    "const": "info",
        -    "description": "Returns information about the environment server."
        -  },
        -  {
        -    "const": "status",
        -    "description": "Returns whether server scripts are available on the plan and activated, and the account username and technical domain."
        -  },
        -  {
        -    "const": "session",
        -    "description": "Returns the current environment session, including selected_domain."
        -  },
        -  {
        -    "const": "session_state",
        -    "description": "Returns the environment session state."
        -  },
        -  {
        -    "const": "usage",
        -    "description": "Returns disk and resource usage of the environment."
        -  },
        -  {
        -    "const": "user_config",
        -    "description": "Returns the environment user configuration."
        -  },
        -  {
        -    "const": "plugins",
        -    "description": "Lists environment plugins. Optional: offset."
        -  },
        -  {
        -    "const": "php_get",
        -    "description": "Returns the PHP version and settings."
        -  },
        -  {
        -    "const": "selector_get",
        -    "description": "Reads a language selector (method get) of plugin phpselector, nodejs_selector or python_selector. Required: plugin, interpreter. Optional: params."
        -  },
        -  {
        -    "const": "node_list",
        -    "description": "Lists Node.js applications. Optional: offset."
        -  },
        -  {
        -    "const": "python_list",
        -    "description": "Lists Python applications. Optional: offset."
        -  },
        -  {
        -    "const": "files_list",
        -    "description": "Lists a directory (default: home) a page at a time. Brief entries by default; detail=full gives complete entries. The reply has page, per_page, total, has_more, truncated and next. Optional: path, page, per_page, offset, detail, limit."
        -  },
        -  {
        -    "const": "files_tree",
        -    "description": "Returns the directory tree under path. A tree over 30 KB loses its deepest levels (truncated, branches marked incomplete); a folder with more subfolders than fit keeps the first of them, and next names the files_list call that lists it in full. Optional: path, limit, offset."
        -  },
        -  {
        -    "const": "files_read",
        -    "description": "Reads a small text file. A binary or larger file is refused; files_publish in apps_write returns a download link for it. Required: path."
        -  },
        -  {
        -    "const": "files_search",
        -    "description": "Searches file names under path, a page at a time; the search finds up to 1000 files. Brief entries by default; detail=full gives complete entries. The reply has page, per_page, total, has_more, truncated and next, and incomplete is true when more files may match than the search found. Required: query. Optional: path, page, per_page, offset, detail, limit."
        -  },
        -  {
        -    "const": "files_disk",
        -    "description": "Returns disk usage of the home directory."
        -  },
        -  {
        -    "const": "files_archive_list",
        -    "description": "Lists the members of an archive a page at a time. The reply has page, per_page, total, has_more, truncated and next. Required: path. Optional: page, per_page, offset, detail."
        -  },
        -  {
        -    "const": "db_list",
        -    "description": "Lists MySQL databases. Optional: offset."
        -  },
        -  {
        -    "const": "db_get",
        -    "description": "Returns one MySQL database (name in database or name). Optional: database, name."
        -  },
        -  {
        -    "const": "db_info",
        -    "description": "Returns MySQL server information."
        -  },
        -  {
        -    "const": "db_user",
        -    "description": "Returns one MySQL user (name in dbuser or name). Optional: dbuser, name."
        -  },
        -  {
        -    "const": "db_users",
        -    "description": "Lists the users of a MySQL database (name in database or name). Optional: database, name, offset."
        -  },
        -  {
        -    "const": "db_users_all",
        -    "description": "Lists all MySQL users. Optional: offset."
        -  },
        -  {
        -    "const": "db_user_databases",
        -    "description": "Lists the databases of a MySQL user (name in dbuser or name). Optional: dbuser, name, offset."
        -  },
        -  {
        -    "const": "ftp_list",
        -    "description": "Lists environment FTP accounts of a domain. Optional: domain, offset."
        -  },
        -  {
        -    "const": "cron_list",
        -    "description": "Lists cron jobs (each with its cron_id) and cron settings. Optional: offset."
        -  },
        -  {
        -    "const": "backup_list",
        -    "description": "Lists environment backups. Optional: domain, offset."
        -  },
        -  {
        -    "const": "login_key_list",
        -    "description": "Lists environment login key records without their values. Optional: offset."
        -  },
        -  {
        -    "const": "da_login_key_list",
        -    "description": "Lists panel login keys of the environment without secret values. Optional: offset."
        -  },
        -  {
        -    "const": "da_login_key_get",
        -    "description": "Returns the settings of one panel login key without secret values. Required: key_id. Optional: id."
        -  },
        -  {
        -    "const": "da_login_key_history",
        -    "description": "Returns the usage history of a panel login key a page at a time. The reply has page, per_page, total, has_more, truncated and next. Required: key_id. Optional: id, page, per_page, offset, detail."
        -  },
        -  {
        -    "const": "da_login_key_commands",
        -    "description": "Lists the commands a panel login key can be allowed or denied. Optional: offset."
        -  }
        -]New value: +[
        +  {
        +    "const": "get_guide",
        +    "description": "Returns a step-by-step guide to the server environment."
        +  },
        +  {
        +    "const": "info",
        +    "description": "Returns information about the environment server."
        +  },
        +  {
        +    "const": "status",
        +    "description": "Returns whether server scripts are available on the plan and activated, and the account username and technical domain."
        +  },
        +  {
        +    "const": "session",
        +    "description": "Returns the current environment session, including selected_domain."
        +  },
        +  {
        +    "const": "session_state",
        +    "description": "Returns the environment session state."
        +  },
        +  {
        +    "const": "usage",
        +    "description": "Returns disk and resource usage of the environment."
        +  },
        +  {
        +    "const": "user_config",
        +    "description": "Returns the environment user configuration."
        +  },
        +  {
        +    "const": "plugins",
        +    "description": "Lists environment plugins. Optional: offset."
        +  },
        +  {
        +    "const": "php_get",
        +    "description": "Returns the PHP version and settings."
        +  },
        +  {
        +    "const": "selector_get",
        +    "description": "Reads a language selector (method get) of plugin phpselector, nodejs_selector or python_selector. Required: plugin, interpreter. Optional: params."
        +  },
        +  {
        +    "const": "node_list",
        +    "description": "Lists Node.js applications. Optional: offset."
        +  },
        +  {
        +    "const": "python_list",
        +    "description": "Lists Python applications. Optional: offset."
        +  },
        +  {
        +    "const": "files_list",
        +    "description": "Lists a directory (default: home) a page at a time. Brief entries by default; detail=full gives complete entries. The reply has page, per_page, total, has_more, truncated and next. Optional: path, page, per_page, offset, detail, limit."
        +  },
        +  {
        +    "const": "files_tree",
        +    "description": "Returns the directory tree under path. A tree over 30 KB loses its deepest levels (truncated, branches marked incomplete); a folder with more subfolders than fit keeps the first of them, and next names the files_list call that lists it in full. Optional: path, limit, offset."
        +  },
        +  {
        +    "const": "files_read",
        +    "description": "Reads a small text file. A binary or larger file is refused; files_publish in apps_write returns a download link for it. Required: path."
        +  },
        +  {
        +    "const": "files_search",
        +    "description": "Searches file names under path, a page at a time; the search finds up to 1000 files. Brief entries by default; detail=full gives complete entries. The reply has page, per_page, total, has_more, truncated and next, and incomplete is true when more files may match than the search found. Required: query. Optional: path, page, per_page, offset, detail, limit."
        +  },
        +  {
        +    "const": "files_disk",
        +    "description": "Returns disk usage of the home directory."
        +  },
        +  {
        +    "const": "files_archive_list",
        +    "description": "Lists the members of an archive a page at a time. The reply has page, per_page, total, has_more, truncated and next. Required: path. Optional: page, per_page, offset, detail."
        +  },
        +  {
        +    "const": "db_list",
        +    "description": "Lists MySQL databases. Optional: offset."
        +  },
        +  {
        +    "const": "db_get",
        +    "description": "Returns one MySQL database (name in database or name). Required: database or name."
        +  },
        +  {
        +    "const": "db_info",
        +    "description": "Returns MySQL server information."
        +  },
        +  {
        +    "const": "db_user",
        +    "description": "Returns one MySQL user (name in dbuser or name). Required: dbuser or name."
        +  },
        +  {
        +    "const": "db_users",
        +    "description": "Lists the users of a MySQL database (name in database or name). Required: database or name. Optional: offset."
        +  },
        +  {
        +    "const": "db_users_all",
        +    "description": "Lists all MySQL users. Optional: offset."
        +  },
        +  {
        +    "const": "db_user_databases",
        +    "description": "Lists the databases of a MySQL user (name in dbuser or name). Required: dbuser or name. Optional: offset."
        +  },
        +  {
        +    "const": "ftp_list",
        +    "description": "Lists environment FTP accounts of a domain. Optional: domain, offset."
        +  },
        +  {
        +    "const": "cron_list",
        +    "description": "Lists cron jobs (each with its cron_id) and cron settings. Optional: offset."
        +  },
        +  {
        +    "const": "backup_list",
        +    "description": "Lists environment backups. Optional: domain, offset."
        +  },
        +  {
        +    "const": "login_key_list",
        +    "description": "Lists environment login key records without their values. Optional: offset."
        +  },
        +  {
        +    "const": "da_login_key_list",
        +    "description": "Lists panel login keys of the environment without secret values. Optional: offset."
        +  },
        +  {
        +    "const": "da_login_key_get",
        +    "description": "Returns the settings of one panel login key without secret values. Required: key_id or id."
        +  },
        +  {
        +    "const": "da_login_key_history",
        +    "description": "Returns the usage history of a panel login key a page at a time. The reply has page, per_page, total, has_more, truncated and next. Required: key_id or id. Optional: page, per_page, offset, detail."
        +  },
        +  {
        +    "const": "da_login_key_commands",
        +    "description": "Lists the commands a panel login key can be allowed or denied. Optional: offset."
        +  }
        +]
    • Changedapps_write1 field changed
      • changedInput schema / properties / action / oneOf
        Previous value: -[
        -  {
        -    "const": "ensure_ready",
        -    "description": "Prepares the environment session: activates the account when needed (then confirm is required), creates the keys and returns username and selected_domain. Optional: confirm."
        -  },
        -  {
        -    "const": "activate",
        -    "description": "Creates the server scripts account of the site. Required: confirm."
        -  },
        -  {
        -    "const": "switch_domain",
        -    "description": "Switches the active environment domain. Required: domain, confirm."
        -  },
        -  {
        -    "const": "php_set_version",
        -    "description": "Sets the PHP version (8.2, 8.3 or native). Required: version."
        -  },
        -  {
        -    "const": "selector_change",
        -    "description": "Runs a language selector method that changes state: set, create, start, stop, restart or install-modules. Required: plugin, interpreter, selector_method. Optional: params."
        -  },
        -  {
        -    "const": "node_create",
        -    "description": "Creates a Node.js application in app_root, served at https://{site}/apps{app_uri}. Required: app_root. Optional: app_uri, version, domain, app_mode, startup_file, env_vars."
        -  },
        -  {
        -    "const": "node_start",
        -    "description": "Starts a Node.js application. Required: app_root."
        -  },
        -  {
        -    "const": "node_stop",
        -    "description": "Stops a Node.js application. Required: app_root."
        -  },
        -  {
        -    "const": "node_restart",
        -    "description": "Restarts a Node.js application. Required: app_root."
        -  },
        -  {
        -    "const": "node_install_modules",
        -    "description": "Installs the npm modules of a Node.js application. Required: app_root."
        -  },
        -  {
        -    "const": "python_create",
        -    "description": "Creates a Python application in app_root, served at https://{site}/apps{app_uri}. Required: app_root. Optional: app_uri, version, domain, startup_file, entry_point, env_vars."
        -  },
        -  {
        -    "const": "python_start",
        -    "description": "Starts a Python application. Required: app_root."
        -  },
        -  {
        -    "const": "python_stop",
        -    "description": "Stops a Python application. Required: app_root."
        -  },
        -  {
        -    "const": "python_restart",
        -    "description": "Restarts a Python application. Required: app_root."
        -  },
        -  {
        -    "const": "python_install_modules",
        -    "description": "Installs the pip modules of a Python application. Required: app_root."
        -  },
        -  {
        -    "const": "files_write",
        -    "description": "Writes a text file (overwrites by default). Required: path, content. Optional: overwrite."
        -  },
        -  {
        -    "const": "files_patch",
        -    "description": "Replaces old_string, which must occur exactly once, with new_string in a small text file. Required: path, old_string, new_string."
        -  },
        -  {
        -    "const": "files_legacy_edit",
        -    "description": "Edits a file through the legacy file manager command. Usually fails with a login key; files_write is the regular way. Required: path, content, confirm."
        -  },
        -  {
        -    "const": "files_mkdir",
        -    "description": "Creates a directory. Required: path."
        -  },
        -  {
        -    "const": "files_copy",
        -    "description": "Copies source (or path) to destination. Required: destination. Optional: source, path, overwrite."
        -  },
        -  {
        -    "const": "files_copy_to",
        -    "description": "Copies paths, sources, source or path into destination_dir. Optional: destination_dir, destination, paths, sources, source, path, merge."
        -  },
        -  {
        -    "const": "files_move",
        -    "description": "Moves source (or path) to destination. Required: destination, confirm. Optional: source, path, overwrite."
        -  },
        -  {
        -    "const": "files_move_to",
        -    "description": "Moves paths, sources, source or path into destination_dir. Required: confirm. Optional: destination_dir, destination, paths, sources, source, path, merge."
        -  },
        -  {
        -    "const": "files_chmod",
        -    "description": "Changes permissions of paths. Required: perm. Optional: paths, sources, source, path."
        -  },
        -  {
        -    "const": "files_archive",
        -    "description": "Creates an archive at destination from sources. Required: destination. Optional: paths, sources, source, path."
        -  },
        -  {
        -    "const": "files_extract",
        -    "description": "Extracts an archive into destination_dir; may overwrite files. Required: confirm. Optional: source, path, destination_dir, destination, members, merge."
        -  },
        -  {
        -    "const": "files_publish",
        -    "description": "Copies a file into a random public folder. The result is a public download URL (https://{site}/apps/_mcp_dl/...) in the technical domain public_html; delete stored_path with apps_delete files_delete afterwards. Optional: path, source."
        -  },
        -  {
        -    "const": "files_download_archive",
        -    "description": "Packs paths into a ZIP in a random public folder. The result is a public download URL (https://{site}/apps/_mcp_dl/...) in the technical domain public_html; delete stored_path with apps_delete files_delete afterwards. Optional: paths, sources, source, path."
        -  },
        -  {
        -    "const": "db_create",
        -    "description": "Creates a MySQL database; the name gets the {username}_ prefix. Optional: database, name, charset, collation."
        -  },
        -  {
        -    "const": "db_create_user",
        -    "description": "Creates a MySQL user; the name gets the {username}_ prefix. Required: password. Optional: dbuser, name, hosts."
        -  },
        -  {
        -    "const": "db_create_with_user",
        -    "description": "Creates a MySQL database and its user with full privileges; the password is returned once. Optional: database, name, dbuser, password, privileges, charset, collation, hosts."
        -  },
        -  {
        -    "const": "db_change_password",
        -    "description": "Changes the password of a MySQL user. Required: new_password, confirm. Optional: dbuser, name, password."
        -  },
        -  {
        -    "const": "db_change_hosts",
        -    "description": "Replaces the host patterns of a MySQL user. Required: hosts, confirm. Optional: dbuser, name."
        -  },
        -  {
        -    "const": "db_change_privs",
        -    "description": "Replaces the privileges of a MySQL user on a database. Required: database, dbuser, confirm. Optional: privileges."
        -  },
        -  {
        -    "const": "db_import",
        -    "description": "Opens a one-time phpMyAdmin sign-in session and returns its link to import a database dump; the SQL does not pass through MCP."
        -  },
        -  {
        -    "const": "db_export",
        -    "description": "Opens a one-time phpMyAdmin sign-in session and returns its link to export a database dump; the SQL does not pass through MCP."
        -  },
        -  {
        -    "const": "phpmyadmin",
        -    "description": "Opens a one-time phpMyAdmin sign-in session and returns its link."
        -  },
        -  {
        -    "const": "ftp_create",
        -    "description": "Creates an environment FTP account. Required: password. Optional: user, name, domain."
        -  },
        -  {
        -    "const": "ftp_modify",
        -    "description": "Changes an environment FTP account. Required: confirm. Optional: user, name, password, domain."
        -  },
        -  {
        -    "const": "ftp_passwd",
        -    "description": "Changes the password of an environment FTP account. Required: password, confirm. Optional: user, name, domain."
        -  },
        -  {
        -    "const": "cron_create",
        -    "description": "Creates a cron job (default schedule: minute 0 of every hour). Required: command. Optional: minute, hour, dayofmonth, month, dayofweek."
        -  },
        -  {
        -    "const": "backup_create",
        -    "description": "Queues a full environment backup; the file appears later under backups/. Required: confirm. Optional: parts, domain."
        -  },
        -  {
        -    "const": "backup_publish",
        -    "description": "Publishes a backup file backups/{file}. The result is a public download URL (https://{site}/apps/_mcp_dl/...) in the technical domain public_html; delete stored_path with apps_delete files_delete afterwards. Required: path."
        -  },
        -  {
        -    "const": "login_key_get",
        -    "description": "Returns one login key with its secret value (default main; the value of main is stored for this site and not returned). Optional: key_id, id."
        -  },
        -  {
        -    "const": "login_key_create",
        -    "description": "Creates a login key record (default main; the value of main is stored for this site and not returned). Optional: key_id, id."
        -  },
        -  {
        -    "const": "login_key_rotate",
        -    "description": "Replaces the value of a login key; the old value stops working. Required: confirm. Optional: key_id, id."
        -  },
        -  {
        -    "const": "da_login_key_create",
        -    "description": "Creates a panel login key; allow_login=true also requires confirm. Required: key_id, password. Optional: id, allow_login, allow_commands, deny_commands, allow_networks, current_password, confirm."
        -  },
        -  {
        -    "const": "da_login_key_patch",
        -    "description": "Changes a panel login key. Required: key_id, confirm. Optional: id, password, allow_login, allow_commands, deny_commands, allow_networks, current_password."
        -  },
        -  {
        -    "const": "visitor_key_get",
        -    "description": "Returns the visitor encryption key with its secret value."
        -  },
        -  {
        -    "const": "visitor_key_create",
        -    "description": "Creates the visitor encryption key."
        -  },
        -  {
        -    "const": "visitor_key_rotate",
        -    "description": "Replaces the visitor encryption key; existing scripts stop decrypting old visitor data. Required: confirm."
        -  }
        -]New value: +[
        +  {
        +    "const": "ensure_ready",
        +    "description": "Prepares the environment session: activates the account when needed (then confirm is required), creates the keys and returns username and selected_domain. Optional: confirm."
        +  },
        +  {
        +    "const": "activate",
        +    "description": "Creates the server scripts account of the site. Required: confirm."
        +  },
        +  {
        +    "const": "switch_domain",
        +    "description": "Switches the active environment domain. Required: domain, confirm."
        +  },
        +  {
        +    "const": "php_set_version",
        +    "description": "Sets the PHP version (8.2, 8.3 or native). Required: version."
        +  },
        +  {
        +    "const": "selector_change",
        +    "description": "Runs a language selector method that changes state: set, create, start, stop, restart or install-modules. Required: plugin, interpreter, selector_method. Optional: params."
        +  },
        +  {
        +    "const": "node_create",
        +    "description": "Creates a Node.js application in app_root, served at https://{site}/apps{app_uri}. Required: app_root. Optional: app_uri, version, domain, app_mode, startup_file, env_vars."
        +  },
        +  {
        +    "const": "node_start",
        +    "description": "Starts a Node.js application. Required: app_root."
        +  },
        +  {
        +    "const": "node_stop",
        +    "description": "Stops a Node.js application. Required: app_root."
        +  },
        +  {
        +    "const": "node_restart",
        +    "description": "Restarts a Node.js application. Required: app_root."
        +  },
        +  {
        +    "const": "node_install_modules",
        +    "description": "Installs the npm modules of a Node.js application. Required: app_root."
        +  },
        +  {
        +    "const": "python_create",
        +    "description": "Creates a Python application in app_root, served at https://{site}/apps{app_uri}. Required: app_root. Optional: app_uri, version, domain, startup_file, entry_point, env_vars."
        +  },
        +  {
        +    "const": "python_start",
        +    "description": "Starts a Python application. Required: app_root."
        +  },
        +  {
        +    "const": "python_stop",
        +    "description": "Stops a Python application. Required: app_root."
        +  },
        +  {
        +    "const": "python_restart",
        +    "description": "Restarts a Python application. Required: app_root."
        +  },
        +  {
        +    "const": "python_install_modules",
        +    "description": "Installs the pip modules of a Python application. Required: app_root."
        +  },
        +  {
        +    "const": "files_write",
        +    "description": "Writes a text file (overwrites by default). Required: path, content. Optional: overwrite."
        +  },
        +  {
        +    "const": "files_patch",
        +    "description": "Replaces old_string, which must occur exactly once, with new_string in a small text file. Required: path, old_string, new_string."
        +  },
        +  {
        +    "const": "files_legacy_edit",
        +    "description": "Edits a file through the legacy file manager command. Usually fails with a login key; files_write is the regular way. Required: path, content, confirm."
        +  },
        +  {
        +    "const": "files_mkdir",
        +    "description": "Creates a directory. Required: path."
        +  },
        +  {
        +    "const": "files_copy",
        +    "description": "Copies source (or path) to destination. Required: destination. Optional: source, path, overwrite."
        +  },
        +  {
        +    "const": "files_copy_to",
        +    "description": "Copies paths, sources, source or path into destination_dir. Optional: destination_dir, destination, paths, sources, source, path, merge."
        +  },
        +  {
        +    "const": "files_move",
        +    "description": "Moves source (or path) to destination. Required: destination, confirm. Optional: source, path, overwrite."
        +  },
        +  {
        +    "const": "files_move_to",
        +    "description": "Moves paths, sources, source or path into destination_dir. Required: confirm. Optional: destination_dir, destination, paths, sources, source, path, merge."
        +  },
        +  {
        +    "const": "files_chmod",
        +    "description": "Changes permissions of paths. Required: perm. Optional: paths, sources, source, path."
        +  },
        +  {
        +    "const": "files_archive",
        +    "description": "Creates an archive at destination from sources. Required: destination. Optional: paths, sources, source, path."
        +  },
        +  {
        +    "const": "files_extract",
        +    "description": "Extracts an archive into destination_dir; may overwrite files. Required: confirm. Optional: source, path, destination_dir, destination, members, merge."
        +  },
        +  {
        +    "const": "files_publish",
        +    "description": "Copies a file into a random public folder. The result is a public download URL (https://{site}/apps/_mcp_dl/...) in the technical domain public_html; delete stored_path with apps_delete files_delete afterwards. Optional: path, source."
        +  },
        +  {
        +    "const": "files_download_archive",
        +    "description": "Packs paths into a ZIP in a random public folder. The result is a public download URL (https://{site}/apps/_mcp_dl/...) in the technical domain public_html; delete stored_path with apps_delete files_delete afterwards. Optional: paths, sources, source, path."
        +  },
        +  {
        +    "const": "db_create",
        +    "description": "Creates a MySQL database; the name gets the {username}_ prefix. Optional: database, name, charset, collation."
        +  },
        +  {
        +    "const": "db_create_user",
        +    "description": "Creates a MySQL user; the name gets the {username}_ prefix. Required: password. Optional: dbuser, name, hosts."
        +  },
        +  {
        +    "const": "db_create_with_user",
        +    "description": "Creates a MySQL database and its user with full privileges; the password is returned once. Optional: database, name, dbuser, password, privileges, charset, collation, hosts."
        +  },
        +  {
        +    "const": "db_change_password",
        +    "description": "Changes the password of a MySQL user. Required: dbuser or name, new_password or password, confirm."
        +  },
        +  {
        +    "const": "db_change_hosts",
        +    "description": "Replaces the host patterns of a MySQL user. Required: dbuser or name, hosts, confirm."
        +  },
        +  {
        +    "const": "db_change_privs",
        +    "description": "Replaces the privileges of a MySQL user on a database. Required: database, dbuser, confirm. Optional: privileges."
        +  },
        +  {
        +    "const": "db_import",
        +    "description": "Opens a one-time phpMyAdmin sign-in session and returns its link to import a database dump; the SQL does not pass through MCP."
        +  },
        +  {
        +    "const": "db_export",
        +    "description": "Opens a one-time phpMyAdmin sign-in session and returns its link to export a database dump; the SQL does not pass through MCP."
        +  },
        +  {
        +    "const": "phpmyadmin",
        +    "description": "Opens a one-time phpMyAdmin sign-in session and returns its link."
        +  },
        +  {
        +    "const": "ftp_create",
        +    "description": "Creates an environment FTP account. Required: password. Optional: user, name, domain."
        +  },
        +  {
        +    "const": "ftp_modify",
        +    "description": "Changes an environment FTP account. Required: confirm. Optional: user, name, password, domain."
        +  },
        +  {
        +    "const": "ftp_passwd",
        +    "description": "Changes the password of an environment FTP account. Required: password, confirm. Optional: user, name, domain."
        +  },
        +  {
        +    "const": "cron_create",
        +    "description": "Creates a cron job (default schedule: minute 0 of every hour). Required: command. Optional: minute, hour, dayofmonth, month, dayofweek."
        +  },
        +  {
        +    "const": "backup_create",
        +    "description": "Queues a full environment backup; the file appears later under backups/. Required: confirm. Optional: parts, domain."
        +  },
        +  {
        +    "const": "backup_publish",
        +    "description": "Publishes a backup file backups/{file}. The result is a public download URL (https://{site}/apps/_mcp_dl/...) in the technical domain public_html; delete stored_path with apps_delete files_delete afterwards. Required: path."
        +  },
        +  {
        +    "const": "login_key_get",
        +    "description": "Returns one login key with its secret value (default main; the value of main is stored for this site and not returned). Optional: key_id, id."
        +  },
        +  {
        +    "const": "login_key_create",
        +    "description": "Creates a login key record (default main; the value of main is stored for this site and not returned). Optional: key_id, id."
        +  },
        +  {
        +    "const": "login_key_rotate",
        +    "description": "Replaces the value of a login key; the old value stops working. Required: confirm. Optional: key_id, id."
        +  },
        +  {
        +    "const": "da_login_key_create",
        +    "description": "Creates a panel login key; allow_login=true also requires confirm. Required: key_id or id, password. Optional: allow_login, allow_commands, deny_commands, allow_networks, current_password, confirm."
        +  },
        +  {
        +    "const": "da_login_key_patch",
        +    "description": "Changes a panel login key. Required: key_id or id, confirm. Optional: password, allow_login, allow_commands, deny_commands, allow_networks, current_password."
        +  },
        +  {
        +    "const": "visitor_key_get",
        +    "description": "Returns the visitor encryption key with its secret value."
        +  },
        +  {
        +    "const": "visitor_key_create",
        +    "description": "Creates the visitor encryption key."
        +  },
        +  {
        +    "const": "visitor_key_rotate",
        +    "description": "Replaces the visitor encryption key; existing scripts stop decrypting old visitor data. Required: confirm."
        +  }
        +]
    • Changedcontent_delete1 field changed
      • changedInput schema / properties / action / oneOf
        Previous value: -[
        -  {
        -    "const": "delete",
        -    "description": "Deletes an entry. Required: module, id, confirm."
        -  },
        -  {
        -    "const": "category_delete",
        -    "description": "Deletes a category. Required: module, id, confirm."
        -  },
        -  {
        -    "const": "comments_delete",
        -    "description": "Deletes a comment. Required: module, id, confirm."
        -  },
        -  {
        -    "const": "filter_delete",
        -    "description": "Deletes an entry filter. Required: module, filter_num, confirm."
        -  },
        -  {
        -    "const": "channel_delete",
        -    "description": "Deletes a video channel (id in channel_id or id). Required: module, confirm. Optional: channel_id, id."
        -  },
        -  {
        -    "const": "channel_category_delete",
        -    "description": "Deletes a video channel category. Required: module, id, confirm."
        -  }
        -]New value: +[
        +  {
        +    "const": "delete",
        +    "description": "Deletes an entry. Required: module, id, confirm."
        +  },
        +  {
        +    "const": "category_delete",
        +    "description": "Deletes a category. Required: module, id, confirm."
        +  },
        +  {
        +    "const": "comments_delete",
        +    "description": "Deletes a comment. Required: module, id, confirm."
        +  },
        +  {
        +    "const": "filter_delete",
        +    "description": "Deletes an entry filter. Required: module, filter_num, confirm."
        +  },
        +  {
        +    "const": "channel_delete",
        +    "description": "Deletes a video channel (id in channel_id or id). Required: module, channel_id or id, confirm."
        +  },
        +  {
        +    "const": "channel_category_delete",
        +    "description": "Deletes a video channel category. Required: module, id, confirm."
        +  }
        +]
    • Changedcontent_write1 field changed
      • changedInput schema / properties / action / oneOf
        Previous value: -[
        -  {
        -    "const": "add",
        -    "description": "Creates an entry and publishes it. Fields depend on the module (faq: subject, question, answer; gb: name, message; video: object; polls: question, answer1, answer2; publ, load, board, dir, stuff: the author name or contact person in name). The required fields of a module are marked in content_read fields; there the code author of publ, load, board, dir and stuff is the name parameter, and ad_type of board is its filter 3. File slots take inline bytes (*_base64 with *_filename), an upload_direct id (*_upload_id), a file already on the site (*_site_path), or a path on the MCP server host (*_path, not reachable for remote agents). The attached file (file_*; load, board, dir, stuff: archive_* too) is saved only when that field is on for the module (fname for news, archive for the others, in content_read fields) and the user group may upload files to the module; a call with a file for a turned-off field is refused. News replies show the attached file in file_name, file_url and file_size; a news add or update whose file was not saved returns the error FILE_NOT_SAVED with entry_saved true: the entry is saved, so the file goes with update and its id, not with a new add. Required: module. Optional: category, title, name, description, message, subject, question, answer, object, pending, ontop, comments, ownurl, hgu_title, meta_title, meta_description, meta_keywords, other1, other2, other3, other4, other5, author, author_id, user_id, add_date, uplastmod, description_type, message_type, subscribe, email, www, position, closed, polltime, pollonly, pollmulty, password, tags, url, custom1, custom2, answer1, answer2, answers, active, poll_id, show_attach, author_email, author_site, author_phone, till_date, link2site, link2source, ad_type, filter1, filter2, filter3, filter4, filter5, fields, photo_path, photo_base64, photo_filename, photo_upload_id, photo_site_path, cover_path, cover_base64, cover_filename, cover_upload_id, cover_site_path, image_path, image_base64, image_filename, image_upload_id, image_site_path, file_path, file_base64, file_filename, file_upload_id, file_site_path, archive_path, archive_base64, archive_filename, archive_upload_id, archive_site_path, screenshot_path, screenshot_base64, screenshot_filename, screenshot_upload_id, screenshot_site_path, image_upload_ids."
        -  },
        -  {
        -    "const": "update",
        -    "description": "Updates an entry. A replaced cover or image can keep its URL; its new width and height are in the reply. File slots take inline bytes (*_base64 with *_filename), an upload_direct id (*_upload_id), a file already on the site (*_site_path), or a path on the MCP server host (*_path, not reachable for remote agents). The attached file (file_*; load, board, dir, stuff: archive_* too) is saved only when that field is on for the module (fname for news, archive for the others, in content_read fields) and the user group may upload files to the module; a call with a file for a turned-off field is refused. News replies show the attached file in file_name, file_url and file_size; a news add or update whose file was not saved returns the error FILE_NOT_SAVED with entry_saved true: the entry is saved, so the file goes with update and its id, not with a new add. Required: module, id. Optional: category, title, name, description, message, subject, question, answer, object, pending, ontop, comments, ownurl, hgu_title, meta_title, meta_description, meta_keywords, other1, other2, other3, other4, other5, author, author_id, user_id, add_date, uplastmod, description_type, message_type, subscribe, email, www, position, closed, polltime, pollonly, pollmulty, password, tags, url, custom1, custom2, answer1, answer2, answers, active, poll_id, show_attach, author_email, author_site, author_phone, till_date, link2site, link2source, ad_type, filter1, filter2, filter3, filter4, filter5, fields, photo_path, photo_base64, photo_filename, photo_upload_id, photo_site_path, cover_path, cover_base64, cover_filename, cover_upload_id, cover_site_path, image_path, image_base64, image_filename, image_upload_id, image_site_path, file_path, file_base64, file_filename, file_upload_id, file_site_path, archive_path, archive_base64, archive_filename, archive_upload_id, archive_site_path, screenshot_path, screenshot_base64, screenshot_filename, screenshot_upload_id, screenshot_site_path, image_upload_ids."
        -  },
        -  {
        -    "const": "tags",
        -    "description": "Sets the tags of an entry (comma-separated). Required: module, id, tags."
        -  },
        -  {
        -    "const": "category_add",
        -    "description": "Creates a category; the image comes from the first filled slot (image, file, cover, photo). File slots take inline bytes (*_base64 with *_filename), an upload_direct id (*_upload_id), a file already on the site (*_site_path), or a path on the MCP server host (*_path, not reachable for remote agents). Required: module. Optional: name, title, description, hgu_title, ownurl, position, access2category, access2add, access2page, meta_title, meta_description, meta_keywords, fields, image_path, image_base64, image_filename, image_upload_id, image_site_path, file_path, file_base64, file_filename, file_upload_id, file_site_path, cover_path, cover_base64, cover_filename, cover_upload_id, cover_site_path, photo_path, photo_base64, photo_filename, photo_upload_id, photo_site_path."
        -  },
        -  {
        -    "const": "category_update",
        -    "description": "Updates a category. Empty values are not sent, so they cannot clear a field. File slots take inline bytes (*_base64 with *_filename), an upload_direct id (*_upload_id), a file already on the site (*_site_path), or a path on the MCP server host (*_path, not reachable for remote agents). Required: module, id. Optional: name, title, description, hgu_title, ownurl, position, access2category, access2add, access2page, meta_title, meta_description, meta_keywords, fields, image_path, image_base64, image_filename, image_upload_id, image_site_path, file_path, file_base64, file_filename, file_upload_id, file_site_path, cover_path, cover_base64, cover_filename, cover_upload_id, cover_site_path, photo_path, photo_base64, photo_filename, photo_upload_id, photo_site_path."
        -  },
        -  {
        -    "const": "comments_add",
        -    "description": "Adds a comment to an entry (entry id in id). Required: module, id, message. Optional: parent_id, user_id, fields."
        -  },
        -  {
        -    "const": "comments_update",
        -    "description": "Updates a comment. Required: module, id. Optional: message, fields."
        -  },
        -  {
        -    "const": "filter_add",
        -    "description": "Creates an entry filter (values separated by |). Required: module. Optional: filter_num, name, items, fields."
        -  },
        -  {
        -    "const": "filter_update",
        -    "description": "Updates an entry filter. Required: module, filter_num. Optional: name, items, fields."
        -  },
        -  {
        -    "const": "channel_add",
        -    "description": "Creates a video channel (module video). Required: module. Optional: name, title, category, description."
        -  },
        -  {
        -    "const": "channel_update",
        -    "description": "Updates a video channel (id in channel_id or id). Required: module. Optional: channel_id, id, name, title, category, description."
        -  },
        -  {
        -    "const": "channel_category_add",
        -    "description": "Creates a video channel category (module video). Required: module. Optional: name, title, parent_id, fields."
        -  },
        -  {
        -    "const": "channel_category_update",
        -    "description": "Updates a video channel category. Required: module, id. Optional: name, title, parent_id, fields."
        -  },
        -  {
        -    "const": "rate",
        -    "description": "Rates a guestbook entry (module gb). Required: module, id, mark."
        -  }
        -]New value: +[
        +  {
        +    "const": "add",
        +    "description": "Creates an entry and publishes it. Fields depend on the module (faq: subject, question, answer; gb: name, message; video: object; polls: question, answer1, answer2; publ, load, board, dir, stuff: the author name or contact person in name). The required fields of a module are marked in content_read fields; there the code author of publ, load, board, dir and stuff is the name parameter, and ad_type of board is its filter 3. File slots take inline bytes (*_base64 with *_filename), an upload_direct id (*_upload_id), a file already on the site (*_site_path), or a path on the MCP server host (*_path, not reachable for remote agents). The attached file (file_*; load, board, dir, stuff: archive_* too) is saved only when that field is on for the module (fname for news, archive for the others, in content_read fields) and the user group may upload files to the module; a call with a file for a turned-off field is refused. News replies show the attached file in file_name, file_url and file_size; a news add or update whose file was not saved returns the error FILE_NOT_SAVED with entry_saved true: the entry is saved, so the file goes with update and its id, not with a new add. Required: module. Optional: category, title, name, description, message, subject, question, answer, object, pending, ontop, comments, ownurl, hgu_title, meta_title, meta_description, meta_keywords, other1, other2, other3, other4, other5, author, author_id, user_id, add_date, uplastmod, description_type, message_type, subscribe, email, www, position, closed, polltime, pollonly, pollmulty, password, tags, url, custom1, custom2, answer1, answer2, answers, active, poll_id, show_attach, author_email, author_site, author_phone, till_date, link2site, link2source, ad_type, filter1, filter2, filter3, filter4, filter5, fields, photo_path, photo_base64, photo_filename, photo_upload_id, photo_site_path, cover_path, cover_base64, cover_filename, cover_upload_id, cover_site_path, image_path, image_base64, image_filename, image_upload_id, image_site_path, file_path, file_base64, file_filename, file_upload_id, file_site_path, archive_path, archive_base64, archive_filename, archive_upload_id, archive_site_path, screenshot_path, screenshot_base64, screenshot_filename, screenshot_upload_id, screenshot_site_path, image_upload_ids."
        +  },
        +  {
        +    "const": "update",
        +    "description": "Updates an entry. A replaced cover or image can keep its URL; its new width and height are in the reply. File slots take inline bytes (*_base64 with *_filename), an upload_direct id (*_upload_id), a file already on the site (*_site_path), or a path on the MCP server host (*_path, not reachable for remote agents). The attached file (file_*; load, board, dir, stuff: archive_* too) is saved only when that field is on for the module (fname for news, archive for the others, in content_read fields) and the user group may upload files to the module; a call with a file for a turned-off field is refused. News replies show the attached file in file_name, file_url and file_size; a news add or update whose file was not saved returns the error FILE_NOT_SAVED with entry_saved true: the entry is saved, so the file goes with update and its id, not with a new add. Required: module, id. Optional: category, title, name, description, message, subject, question, answer, object, pending, ontop, comments, ownurl, hgu_title, meta_title, meta_description, meta_keywords, other1, other2, other3, other4, other5, author, author_id, user_id, add_date, uplastmod, description_type, message_type, subscribe, email, www, position, closed, polltime, pollonly, pollmulty, password, tags, url, custom1, custom2, answer1, answer2, answers, active, poll_id, show_attach, author_email, author_site, author_phone, till_date, link2site, link2source, ad_type, filter1, filter2, filter3, filter4, filter5, fields, photo_path, photo_base64, photo_filename, photo_upload_id, photo_site_path, cover_path, cover_base64, cover_filename, cover_upload_id, cover_site_path, image_path, image_base64, image_filename, image_upload_id, image_site_path, file_path, file_base64, file_filename, file_upload_id, file_site_path, archive_path, archive_base64, archive_filename, archive_upload_id, archive_site_path, screenshot_path, screenshot_base64, screenshot_filename, screenshot_upload_id, screenshot_site_path, image_upload_ids."
        +  },
        +  {
        +    "const": "tags",
        +    "description": "Sets the tags of an entry (comma-separated). Required: module, id, tags."
        +  },
        +  {
        +    "const": "category_add",
        +    "description": "Creates a category; the image comes from the first filled slot (image, file, cover, photo). File slots take inline bytes (*_base64 with *_filename), an upload_direct id (*_upload_id), a file already on the site (*_site_path), or a path on the MCP server host (*_path, not reachable for remote agents). Required: module. Optional: name, title, description, hgu_title, ownurl, position, access2category, access2add, access2page, meta_title, meta_description, meta_keywords, fields, image_path, image_base64, image_filename, image_upload_id, image_site_path, file_path, file_base64, file_filename, file_upload_id, file_site_path, cover_path, cover_base64, cover_filename, cover_upload_id, cover_site_path, photo_path, photo_base64, photo_filename, photo_upload_id, photo_site_path."
        +  },
        +  {
        +    "const": "category_update",
        +    "description": "Updates a category. Empty values are not sent, so they cannot clear a field. File slots take inline bytes (*_base64 with *_filename), an upload_direct id (*_upload_id), a file already on the site (*_site_path), or a path on the MCP server host (*_path, not reachable for remote agents). Required: module, id. Optional: name, title, description, hgu_title, ownurl, position, access2category, access2add, access2page, meta_title, meta_description, meta_keywords, fields, image_path, image_base64, image_filename, image_upload_id, image_site_path, file_path, file_base64, file_filename, file_upload_id, file_site_path, cover_path, cover_base64, cover_filename, cover_upload_id, cover_site_path, photo_path, photo_base64, photo_filename, photo_upload_id, photo_site_path."
        +  },
        +  {
        +    "const": "comments_add",
        +    "description": "Adds a comment to an entry (entry id in id). Required: module, id, message. Optional: parent_id, user_id, fields."
        +  },
        +  {
        +    "const": "comments_update",
        +    "description": "Updates a comment. Required: module, id. Optional: message, fields."
        +  },
        +  {
        +    "const": "filter_add",
        +    "description": "Creates an entry filter (values separated by |). Required: module. Optional: filter_num, name, items, fields."
        +  },
        +  {
        +    "const": "filter_update",
        +    "description": "Updates an entry filter. Required: module, filter_num. Optional: name, items, fields."
        +  },
        +  {
        +    "const": "channel_add",
        +    "description": "Creates a video channel (module video). Required: module. Optional: name, title, category, description."
        +  },
        +  {
        +    "const": "channel_update",
        +    "description": "Updates a video channel (id in channel_id or id). Required: module, channel_id or id. Optional: name, title, category, description."
        +  },
        +  {
        +    "const": "channel_category_add",
        +    "description": "Creates a video channel category (module video). Required: module. Optional: name, title, parent_id, fields."
        +  },
        +  {
        +    "const": "channel_category_update",
        +    "description": "Updates a video channel category. Required: module, id. Optional: name, title, parent_id, fields."
        +  },
        +  {
        +    "const": "rate",
        +    "description": "Rates a guestbook entry (module gb). Required: module, id, mark."
        +  }
        +]
    • Changedfiles_write1 field changed
      • changedInput schema / properties / action / oneOf
        Previous value: -[
        -  {
        -    "const": "content_put",
        -    "description": "Writes text into a file. Required: path, content. Optional: create."
        -  },
        -  {
        -    "const": "upload",
        -    "description": "Uploads one or more files into the folder path. Bytes come from files, content, content_base64, file, upload_id and upload_ids. Pass size and sha256 with inline bodies; a successful upload returns sent with both. Returns per-item results. Optional: path, files, content, content_base64, file, filename, name, size, sha256, upload_id, upload_ids, add_wmark."
        -  },
        -  {
        -    "const": "upload_url",
        -    "description": "Downloads a file from a public URL into the folder path. Returns per-item results. Required: url. Optional: path, name, add_wmark."
        -  },
        -  {
        -    "const": "upload_direct",
        -    "description": "Creates a one-time upload URL for a file of the given name and exact size, so binary files never pass through the model context. POST the raw bytes to the returned upload_url (for example with curl); the response is upload_id, filename, size and sha256. Pass upload_id to upload (with path), or as *_upload_id to the content and shop write tools. Required: filename, size."
        -  },
        -  {
        -    "const": "mkdir",
        -    "description": "Creates a folder. Required: path."
        -  },
        -  {
        -    "const": "rename",
        -    "description": "Renames one item (path and name) or several items in the folder path (items). Batch form returns per-item results. Required: path. Optional: name, items."
        -  },
        -  {
        -    "const": "move",
        -    "description": "Moves path, or every item of paths, into destination. The paths form returns per-item results. Required: destination. Optional: path, paths."
        -  }
        -]New value: +[
        +  {
        +    "const": "content_put",
        +    "description": "Writes text into a file. Required: path, content. Optional: create."
        +  },
        +  {
        +    "const": "upload",
        +    "description": "Uploads one or more files into the folder path. Bytes come from files, content, content_base64, file, upload_id and upload_ids. Pass size and sha256 with inline bodies; a successful upload returns sent with both. Returns per-item results. Optional: path, files, content, content_base64, file, filename, name, size, sha256, upload_id, upload_ids, add_wmark."
        +  },
        +  {
        +    "const": "upload_url",
        +    "description": "Downloads a file from a public URL into the folder path. Returns per-item results. Required: url. Optional: path, name, add_wmark."
        +  },
        +  {
        +    "const": "upload_direct",
        +    "description": "Creates a one-time upload URL for a file of the given name and exact size, so binary files never pass through the model context. POST the raw bytes to the returned upload_url (for example with curl); the response is upload_id, filename, size and sha256. Pass upload_id to upload (with path), or as *_upload_id to the content and shop write tools. Required: filename or name, size."
        +  },
        +  {
        +    "const": "mkdir",
        +    "description": "Creates a folder. Required: path."
        +  },
        +  {
        +    "const": "rename",
        +    "description": "Renames one item (path and name) or several items in the folder path (items). Batch form returns per-item results. Required: path. Optional: name, items."
        +  },
        +  {
        +    "const": "move",
        +    "description": "Moves path, or every item of paths, into destination. The paths form returns per-item results. Required: destination. Optional: path, paths."
        +  }
        +]
    • Changedforum_delete1 field changed
      • changedInput schema / properties / action / oneOf
        Previous value: -[
        -  {
        -    "const": "forum_delete",
        -    "description": "Deletes a forum (id in forum_id or id). Required: confirm. Optional: forum_id, id."
        -  },
        -  {
        -    "const": "section_delete",
        -    "description": "Deletes a forum section (id in section_id or id). Required: confirm. Optional: section_id, id."
        -  },
        -  {
        -    "const": "topic_delete",
        -    "description": "Deletes a topic (id in topic_id or id). Required: confirm. Optional: topic_id, id."
        -  },
        -  {
        -    "const": "post_delete",
        -    "description": "Deletes a post (id in post_id or id). Required: confirm. Optional: post_id, id."
        -  },
        -  {
        -    "const": "poll_delete",
        -    "description": "Deletes a forum poll (id in poll_id or id). Required: confirm. Optional: poll_id, id."
        -  }
        -]New value: +[
        +  {
        +    "const": "forum_delete",
        +    "description": "Deletes a forum (id in forum_id or id). Required: forum_id or id, confirm."
        +  },
        +  {
        +    "const": "section_delete",
        +    "description": "Deletes a forum section (id in section_id or id). Required: section_id or id, confirm."
        +  },
        +  {
        +    "const": "topic_delete",
        +    "description": "Deletes a topic (id in topic_id or id). Required: topic_id or id, confirm."
        +  },
        +  {
        +    "const": "post_delete",
        +    "description": "Deletes a post (id in post_id or id). Required: post_id or id, confirm."
        +  },
        +  {
        +    "const": "poll_delete",
        +    "description": "Deletes a forum poll (id in poll_id or id). Required: poll_id or id, confirm."
        +  }
        +]
    • Changedforum_read1 field changed
      • changedInput schema / properties / action / oneOf
        Previous value: -[
        -  {
        -    "const": "forum_list",
        -    "description": "Lists forums, or the forums under id (or forum_id). Optional: id, forum_id, offset."
        -  },
        -  {
        -    "const": "forum_get",
        -    "description": "Returns one forum (id in forum_id or id). Optional: forum_id, id."
        -  },
        -  {
        -    "const": "section_list",
        -    "description": "Lists forum sections, or returns one (id in section_id or id). Optional: section_id, id, offset."
        -  },
        -  {
        -    "const": "topic_list",
        -    "description": "Lists the topics of a forum a page at a time. Brief topics by default; detail=full gives complete topics. The reply has page, per_page, total, has_more, truncated and next. Optional: forum_id, topic_id, page, per_page, offset, detail."
        -  },
        -  {
        -    "const": "topic_get",
        -    "description": "Returns one topic (id in topic_id or id). Optional: topic_id, id, forum_id."
        -  },
        -  {
        -    "const": "post_list",
        -    "description": "Lists the posts of a topic a page at a time. Brief posts by default, without full texts; detail=full gives complete posts, post_get one complete post. The reply has page, per_page, total, has_more, truncated and next. Optional: topic_id, post_id, page, per_page, offset, detail."
        -  },
        -  {
        -    "const": "post_get",
        -    "description": "Returns one post (id in post_id or id). Optional: post_id, id, topic_id."
        -  },
        -  {
        -    "const": "poll_list",
        -    "description": "Lists forum polls a page at a time. Brief polls by default; detail=full gives complete polls. The reply has page, per_page, total, has_more, truncated and next. Optional: forum_id, poll_id, page, per_page, offset, detail."
        -  },
        -  {
        -    "const": "poll_get",
        -    "description": "Returns one forum poll (id in poll_id or id). Optional: poll_id, id, forum_id."
        -  },
        -  {
        -    "const": "poll_results",
        -    "description": "Returns the results of a forum poll (id in poll_id or id). Optional: poll_id, id."
        -  }
        -]New value: +[
        +  {
        +    "const": "forum_list",
        +    "description": "Lists forums, or the forums under id (or forum_id). Optional: id, forum_id, offset."
        +  },
        +  {
        +    "const": "forum_get",
        +    "description": "Returns one forum (id in forum_id or id). Required: forum_id or id."
        +  },
        +  {
        +    "const": "section_list",
        +    "description": "Lists forum sections, or returns one (id in section_id or id). Optional: section_id, id, offset."
        +  },
        +  {
        +    "const": "topic_list",
        +    "description": "Lists the topics of a forum a page at a time. Brief topics by default; detail=full gives complete topics. The reply has page, per_page, total, has_more, truncated and next. Optional: forum_id, topic_id, page, per_page, offset, detail."
        +  },
        +  {
        +    "const": "topic_get",
        +    "description": "Returns one topic (id in topic_id or id). Required: topic_id or id. Optional: forum_id."
        +  },
        +  {
        +    "const": "post_list",
        +    "description": "Lists the posts of a topic a page at a time. Brief posts by default, without full texts; detail=full gives complete posts, post_get one complete post. The reply has page, per_page, total, has_more, truncated and next. Required: topic_id or post_id. Optional: page, per_page, offset, detail."
        +  },
        +  {
        +    "const": "post_get",
        +    "description": "Returns one post (id in post_id or id). Required: post_id or id. Optional: topic_id."
        +  },
        +  {
        +    "const": "poll_list",
        +    "description": "Lists forum polls a page at a time. Brief polls by default; detail=full gives complete polls. The reply has page, per_page, total, has_more, truncated and next. Optional: forum_id, poll_id, page, per_page, offset, detail."
        +  },
        +  {
        +    "const": "poll_get",
        +    "description": "Returns one forum poll (id in poll_id or id). Required: poll_id or id. Optional: forum_id."
        +  },
        +  {
        +    "const": "poll_results",
        +    "description": "Returns the results of a forum poll (id in poll_id or id). Required: poll_id or id."
        +  }
        +]
    • Changedforum_write1 field changed
      • changedInput schema / properties / action / oneOf
        Previous value: -[
        -  {
        -    "const": "forum_add",
        -    "description": "Creates a forum in a section; forum_id makes it a subforum. Optional: name, title, description, section_id, forum_id, fields."
        -  },
        -  {
        -    "const": "forum_update",
        -    "description": "Updates a forum (id in forum_id or id). Optional: forum_id, id, name, title, description, section_id, fields."
        -  },
        -  {
        -    "const": "section_add",
        -    "description": "Creates a forum section. Optional: name, title, fields."
        -  },
        -  {
        -    "const": "section_update",
        -    "description": "Updates a forum section (id in section_id or id). Optional: section_id, id, name, title, fields."
        -  },
        -  {
        -    "const": "topic_add",
        -    "description": "Creates a topic in the forum forum_id (or id) with its first post. Optional: forum_id, id, name, title, description, message, user_id, author_id, closed, ontop, password, fields."
        -  },
        -  {
        -    "const": "topic_update",
        -    "description": "Updates a topic (id in topic_id or id). Optional: topic_id, id, name, title, description, nfid, user_id, author_id, fields."
        -  },
        -  {
        -    "const": "topic_close",
        -    "description": "Closes a topic (id in topic_id or id). Optional: topic_id, id."
        -  },
        -  {
        -    "const": "topic_open",
        -    "description": "Reopens a topic (id in topic_id or id). Optional: topic_id, id."
        -  },
        -  {
        -    "const": "topic_pin",
        -    "description": "Pins a topic (id in topic_id or id). Optional: topic_id, id."
        -  },
        -  {
        -    "const": "topic_unpin",
        -    "description": "Unpins a topic (id in topic_id or id). Optional: topic_id, id."
        -  },
        -  {
        -    "const": "topic_move",
        -    "description": "Moves a topic to the forum nfid (id in topic_id or id). Required: nfid. Optional: topic_id, id, name, title, description."
        -  },
        -  {
        -    "const": "topic_join",
        -    "description": "Joins a topic (topic_id or id) into the topic target_id. Required: target_id, confirm. Optional: topic_id, id."
        -  },
        -  {
        -    "const": "topic_split",
        -    "description": "Splits the posts post_ids into a new topic in the forum nfid. Required: post_ids, confirm. Optional: name, title, description, nfid."
        -  },
        -  {
        -    "const": "topic_subscribe",
        -    "description": "Subscribes to a topic (id in topic_id or id). Optional: topic_id, id."
        -  },
        -  {
        -    "const": "topic_unsubscribe",
        -    "description": "Unsubscribes from a topic (id in topic_id or id). Optional: topic_id, id."
        -  },
        -  {
        -    "const": "post_add",
        -    "description": "Adds a post to a topic (id in topic_id or id). Required: message. Optional: topic_id, id, user_id, fields."
        -  },
        -  {
        -    "const": "post_update",
        -    "description": "Updates a post (id in post_id or id). Optional: post_id, id, message, fields."
        -  },
        -  {
        -    "const": "post_move",
        -    "description": "Moves the posts post_ids into the topic target_id. Required: post_ids, target_id, confirm."
        -  },
        -  {
        -    "const": "post_pin",
        -    "description": "Pins the first post of a topic on every page (topic in topic_id or id). Optional: topic_id, id."
        -  },
        -  {
        -    "const": "post_unpin",
        -    "description": "Unpins the first post of a topic (topic in topic_id or id). Optional: topic_id, id."
        -  },
        -  {
        -    "const": "poll_add",
        -    "description": "Creates a poll topic in the forum forum_id (or id); answers are separated by |. Optional: forum_id, id, name, title, description, message, question, answers, polltime, pollonly, pollmulty, fields."
        -  },
        -  {
        -    "const": "poll_update",
        -    "description": "Updates a forum poll (id in poll_id or id). Optional: poll_id, id, question, fields."
        -  },
        -  {
        -    "const": "poll_move",
        -    "description": "Moves a forum poll to the forum nfid (id in poll_id or id). Required: nfid. Optional: poll_id, id, name, title, description."
        -  },
        -  {
        -    "const": "poll_close",
        -    "description": "Closes a forum poll (id in poll_id or id). Optional: poll_id, id."
        -  },
        -  {
        -    "const": "poll_open",
        -    "description": "Reopens a forum poll (id in poll_id or id). Optional: poll_id, id."
        -  },
        -  {
        -    "const": "poll_pin",
        -    "description": "Pins a forum poll (id in poll_id or id). Optional: poll_id, id."
        -  },
        -  {
        -    "const": "poll_unpin",
        -    "description": "Unpins a forum poll (id in poll_id or id). Optional: poll_id, id."
        -  },
        -  {
        -    "const": "poll_join",
        -    "description": "Joins a forum poll (poll_id or id) into the topic target_id. Required: target_id, confirm. Optional: poll_id, id."
        -  },
        -  {
        -    "const": "poll_split",
        -    "description": "Splits the posts post_ids of a forum poll into a new topic in the forum nfid. Required: post_ids, confirm. Optional: name, title, description, nfid."
        -  },
        -  {
        -    "const": "poll_subscribe",
        -    "description": "Subscribes to a forum poll (id in poll_id or id). Optional: poll_id, id."
        -  },
        -  {
        -    "const": "poll_vote",
        -    "description": "Votes in a forum poll (id in poll_id or id); vote holds the answer index, or several comma-separated. Required: vote. Optional: poll_id, id."
        -  }
        -]New value: +[
        +  {
        +    "const": "forum_add",
        +    "description": "Creates a forum in a section; forum_id makes it a subforum. Required: name or title, section_id or forum_id. Optional: description, fields."
        +  },
        +  {
        +    "const": "forum_update",
        +    "description": "Updates a forum (id in forum_id or id). Required: forum_id or id. Optional: name, title, description, section_id, fields."
        +  },
        +  {
        +    "const": "section_add",
        +    "description": "Creates a forum section. Required: name or title. Optional: fields."
        +  },
        +  {
        +    "const": "section_update",
        +    "description": "Updates a forum section (id in section_id or id). Required: section_id or id. Optional: name, title, fields."
        +  },
        +  {
        +    "const": "topic_add",
        +    "description": "Creates a topic in the forum forum_id (or id) with its first post. Required: forum_id or id. Optional: name, title, description, message, user_id, author_id, closed, ontop, password, fields."
        +  },
        +  {
        +    "const": "topic_update",
        +    "description": "Updates a topic (id in topic_id or id). Required: topic_id or id. Optional: name, title, description, nfid, user_id, author_id, fields."
        +  },
        +  {
        +    "const": "topic_close",
        +    "description": "Closes a topic (id in topic_id or id). Required: topic_id or id."
        +  },
        +  {
        +    "const": "topic_open",
        +    "description": "Reopens a topic (id in topic_id or id). Required: topic_id or id."
        +  },
        +  {
        +    "const": "topic_pin",
        +    "description": "Pins a topic (id in topic_id or id). Required: topic_id or id."
        +  },
        +  {
        +    "const": "topic_unpin",
        +    "description": "Unpins a topic (id in topic_id or id). Required: topic_id or id."
        +  },
        +  {
        +    "const": "topic_move",
        +    "description": "Moves a topic to the forum nfid (id in topic_id or id). Required: topic_id or id, nfid. Optional: name, title, description."
        +  },
        +  {
        +    "const": "topic_join",
        +    "description": "Joins a topic (topic_id or id) into the topic target_id. Required: topic_id or id, target_id, confirm."
        +  },
        +  {
        +    "const": "topic_split",
        +    "description": "Splits the posts post_ids into a new topic in the forum nfid. Required: post_ids, confirm. Optional: name, title, description, nfid."
        +  },
        +  {
        +    "const": "topic_subscribe",
        +    "description": "Subscribes to a topic (id in topic_id or id). Required: topic_id or id."
        +  },
        +  {
        +    "const": "topic_unsubscribe",
        +    "description": "Unsubscribes from a topic (id in topic_id or id). Required: topic_id or id."
        +  },
        +  {
        +    "const": "post_add",
        +    "description": "Adds a post to a topic (id in topic_id or id). Required: topic_id or id, message. Optional: user_id, fields."
        +  },
        +  {
        +    "const": "post_update",
        +    "description": "Updates a post (id in post_id or id). Required: post_id or id. Optional: message, fields."
        +  },
        +  {
        +    "const": "post_move",
        +    "description": "Moves the posts post_ids into the topic target_id. Required: post_ids, target_id, confirm."
        +  },
        +  {
        +    "const": "post_pin",
        +    "description": "Pins the first post of a topic on every page (topic in topic_id or id). Required: topic_id or id."
        +  },
        +  {
        +    "const": "post_unpin",
        +    "description": "Unpins the first post of a topic (topic in topic_id or id). Required: topic_id or id."
        +  },
        +  {
        +    "const": "poll_add",
        +    "description": "Creates a poll topic in the forum forum_id (or id); answers are separated by |. Required: forum_id or id. Optional: name, title, description, message, question, answers, polltime, pollonly, pollmulty, fields."
        +  },
        +  {
        +    "const": "poll_update",
        +    "description": "Updates a forum poll (id in poll_id or id). Required: poll_id or id. Optional: question, fields."
        +  },
        +  {
        +    "const": "poll_move",
        +    "description": "Moves a forum poll to the forum nfid (id in poll_id or id). Required: poll_id or id, nfid. Optional: name, title, description."
        +  },
        +  {
        +    "const": "poll_close",
        +    "description": "Closes a forum poll (id in poll_id or id). Required: poll_id or id."
        +  },
        +  {
        +    "const": "poll_open",
        +    "description": "Reopens a forum poll (id in poll_id or id). Required: poll_id or id."
        +  },
        +  {
        +    "const": "poll_pin",
        +    "description": "Pins a forum poll (id in poll_id or id). Required: poll_id or id."
        +  },
        +  {
        +    "const": "poll_unpin",
        +    "description": "Unpins a forum poll (id in poll_id or id). Required: poll_id or id."
        +  },
        +  {
        +    "const": "poll_join",
        +    "description": "Joins a forum poll (poll_id or id) into the topic target_id. Required: poll_id or id, target_id, confirm."
        +  },
        +  {
        +    "const": "poll_split",
        +    "description": "Splits the posts post_ids of a forum poll into a new topic in the forum nfid. Required: post_ids, confirm. Optional: name, title, description, nfid."
        +  },
        +  {
        +    "const": "poll_subscribe",
        +    "description": "Subscribes to a forum poll (id in poll_id or id). Required: poll_id or id."
        +  },
        +  {
        +    "const": "poll_vote",
        +    "description": "Votes in a forum poll (id in poll_id or id); vote holds the answer index, or several comma-separated. Required: poll_id or id, vote."
        +  }
        +]
    • Changedshop_delete1 field changed
      • changedInput schema / properties / ids / description
        Previous value: -"Comma-separated ids (invoice_*, stock_remove)."New value: +"Ids separated by commas (invoice_*: order ids, also separated by |; stock_remove)."
    • Changedshop_read3 fields changed
      • changedInput schema / properties / action / oneOf
        Previous value: -[
        -  {
        -    "const": "category_list",
        -    "description": "Lists shop categories (children of parent_id when set). Optional: parent_id, pid, get_globals, offset."
        -  },
        -  {
        -    "const": "list",
        -    "description": "Lists products a page at a time, with sorting and filters: all goods, the wishlist of the current user, or the goods of user_id (view usergoods). By default products are brief, without descriptions; complete products come with detail=full, and one complete product card from get by id. The reply has page, per_page, total, has_more, truncated and, while products remain, next with the paging arguments of the following page. A shop that shows fewer than 5 products a catalog page serves fewer products a list page than per_page asks; the reply per_page names how many, and pages by number stay consecutive. Optional: view, user_id, page, pnum, per_page, offset, detail, sort, order, f_name, f_brand, f_art, f_price, f_stock, f_status, f_warr, f_weight."
        -  },
        -  {
        -    "const": "get",
        -    "description": "Returns one product card. Required: id. Optional: cnt, goods_id."
        -  },
        -  {
        -    "const": "variations_list",
        -    "description": "Lists the variations of a product. Required: id. Optional: offset."
        -  },
        -  {
        -    "const": "variation_get",
        -    "description": "Returns one variation of a product. Required: id, variation_crc."
        -  },
        -  {
        -    "const": "variation_dict_list",
        -    "description": "Returns one variation dictionary (name and values) by its id. Required: id."
        -  },
        -  {
        -    "const": "stock_get",
        -    "description": "Returns the stock of a product by option sets. Required: id. Optional: offset."
        -  },
        -  {
        -    "const": "basket_get",
        -    "description": "Returns the basket of the current user, or of user_id. Optional: user_id."
        -  },
        -  {
        -    "const": "checkout_get",
        -    "description": "Returns the checkout form data for the current basket. Optional: promo_code, custom_delivery_tax."
        -  },
        -  {
        -    "const": "invoices_list",
        -    "description": "Lists orders with filters, a page at a time, paged like list. Brief orders by default; detail=full gives complete orders, order_get one complete order. Optional: page, per_page, offset, detail, user_id, hide, status, group_courier, payment_id, delivery_id, ids, id, inv_sum, cdate, date."
        -  },
        -  {
        -    "const": "order_get",
        -    "description": "Returns one order (order hash in order or id). Optional: order, id."
        -  },
        -  {
        -    "const": "comments_list",
        -    "description": "Lists the comments of a product a page at a time, paged like list. Brief comments by default; detail=full gives complete comments. Required: id. Optional: page, per_page, offset, detail."
        -  },
        -  {
        -    "const": "currencies",
        -    "description": "Lists shop currencies and rates. Optional: offset."
        -  },
        -  {
        -    "const": "balance_get",
        -    "description": "Returns the balance of a user. Optional: user_id."
        -  }
        -]New value: +[
        +  {
        +    "const": "category_list",
        +    "description": "Lists shop categories (children of parent_id when set). Optional: parent_id, pid, get_globals, offset."
        +  },
        +  {
        +    "const": "list",
        +    "description": "Lists products a page at a time, with sorting and filters: all goods, the wishlist of the current user, or the goods of user_id (view usergoods, which user_id alone selects). By default products are brief, without descriptions; complete products come with detail=full, and one complete product card from get by id. The reply has page, per_page, total, has_more, truncated and, while products remain, next with the paging arguments of the following page. A shop that shows fewer than 5 products a catalog page serves fewer products a list page than per_page asks; the reply per_page names how many, and pages by number stay consecutive. Optional: view, user_id, page, pnum, per_page, offset, detail, sort, order, f_name, f_brand, f_art, f_price, f_stock, f_status, f_warr, f_weight."
        +  },
        +  {
        +    "const": "get",
        +    "description": "Returns one product card. Required: id. Optional: cnt, goods_id."
        +  },
        +  {
        +    "const": "variations_list",
        +    "description": "Lists the variations of a product. Required: id. Optional: offset."
        +  },
        +  {
        +    "const": "variation_get",
        +    "description": "Returns one variation of a product. Required: id, variation_crc."
        +  },
        +  {
        +    "const": "variation_dict_list",
        +    "description": "Returns one variation dictionary (name and values) by its id. Required: id."
        +  },
        +  {
        +    "const": "stock_get",
        +    "description": "Returns the stock of a product by option sets. Required: id. Optional: offset."
        +  },
        +  {
        +    "const": "basket_get",
        +    "description": "Returns the basket of the current user, or of user_id. Optional: user_id."
        +  },
        +  {
        +    "const": "checkout_get",
        +    "description": "Returns the checkout form data for the current basket. Optional: promo_code, custom_delivery_tax."
        +  },
        +  {
        +    "const": "invoices_list",
        +    "description": "Lists orders with filters, a page at a time, paged like list. Brief orders by default; detail=full gives complete orders, order_get one complete order. Optional: page, per_page, offset, detail, user_id, hide, status, group_courier, payment_id, delivery_id, ids, id, inv_sum, cdate, date."
        +  },
        +  {
        +    "const": "order_get",
        +    "description": "Returns one order (order hash in order or id). Required: order or id."
        +  },
        +  {
        +    "const": "comments_list",
        +    "description": "Lists the comments of a product a page at a time, paged like list. Brief comments by default; detail=full gives complete comments. Required: id. Optional: page, per_page, offset, detail."
        +  },
        +  {
        +    "const": "currencies",
        +    "description": "Lists shop currencies and rates. Optional: offset."
        +  },
        +  {
        +    "const": "balance_get",
        +    "description": "Returns the balance of a user. Optional: user_id."
        +  }
        +]
      • changedInput schema / properties / ids / description
        Previous value: -"Comma-separated ids (invoice_*, stock_remove)."New value: +"Ids separated by commas (invoice_*: order ids, also separated by |; stock_remove)."
      • changedInput schema / properties / view / description
        Previous value: -"Goods list view. Default allgoods."New value: +"Goods list view. Default usergoods when user_id is given, otherwise allgoods."
    • Changedshop_write2 fields changed
      • changedInput schema / properties / action / oneOf
        Previous value: -[
        -  {
        -    "const": "category_add",
        -    "description": "Creates a category, with an image when an image slot is filled. The category image must be a .jpg, .png or .gif file (.jpeg is renamed to .jpg). Image slots take inline bytes (*_base64 with *_filename), an upload_direct id (*_upload_id), a file already on the site (*_site_path), or a path on the MCP server host (*_path, not reachable for remote agents). Optional: name, pid, parent_id, global_cat, dscr, brief, meta_title, meta_dscr, url, pos, view_groups, add_groups, exclude_from_discount, fields, image_path, image_base64, image_filename, image_upload_id, image_site_path, file_path, file_base64, file_filename, file_upload_id, file_site_path."
        -  },
        -  {
        -    "const": "category_update",
        -    "description": "Updates a category; a filled image slot replaces its image. The category image must be a .jpg, .png or .gif file (.jpeg is renamed to .jpg). The current image is removed before the new one is saved, so a file with such an extension that is not a valid image leaves the category without an image. Image slots take inline bytes (*_base64 with *_filename), an upload_direct id (*_upload_id), a file already on the site (*_site_path), or a path on the MCP server host (*_path, not reachable for remote agents). Required: id. Optional: name, pid, parent_id, global_cat, dscr, brief, meta_title, meta_dscr, url, pos, view_groups, add_groups, exclude_from_discount, fields, image_path, image_base64, image_filename, image_upload_id, image_site_path, file_path, file_base64, file_filename, file_upload_id, file_site_path."
        -  },
        -  {
        -    "const": "category_show",
        -    "description": "Shows a hidden category. Required: id. Optional: fields."
        -  },
        -  {
        -    "const": "category_hide",
        -    "description": "Hides a category. Required: id. Optional: fields."
        -  },
        -  {
        -    "const": "category_image",
        -    "description": "Uploads the image of a category from the first filled image slot. The category image must be a .jpg, .png or .gif file (.jpeg is renamed to .jpg). The current image is removed before the new one is saved, so a file with such an extension that is not a valid image leaves the category without an image. Image slots take inline bytes (*_base64 with *_filename), an upload_direct id (*_upload_id), a file already on the site (*_site_path), or a path on the MCP server host (*_path, not reachable for remote agents). Required: id. Optional: image_path, image_base64, image_filename, image_upload_id, image_site_path, file_path, file_base64, file_filename, file_upload_id, file_site_path, fields."
        -  },
        -  {
        -    "const": "add",
        -    "description": "Creates a product. Optional: cat_id, name, brief, dscr, html_dscr, price, price_in, price_old, stock, art, brand, url, meta_title, meta_dscr, tags, type, cats_add, ch_addcat, unit, weight, warr, undisc, fields."
        -  },
        -  {
        -    "const": "update",
        -    "description": "Updates a product. Required: id. Optional: cat_id, name, brief, dscr, html_dscr, price, price_in, price_old, stock, art, brand, url, meta_title, meta_dscr, tags, type, cats_add, ch_addcat, unit, weight, warr, undisc, fields."
        -  },
        -  {
        -    "const": "hide",
        -    "description": "Hides or shows a product. Required: id. Optional: hide, fields."
        -  },
        -  {
        -    "const": "cnt_save",
        -    "description": "Saves product counters (views, sales, orders, rating, stock). Required: id. Optional: views, solds, ordered, rate_num, rate_sum, stock_q, fields."
        -  },
        -  {
        -    "const": "img_add",
        -    "description": "Adds images to a product. Image slots take inline bytes (*_base64 with *_filename), an upload_direct id (*_upload_id), a file already on the site (*_site_path), or a path on the MCP server host (*_path, not reachable for remote agents). Required: id. Optional: image_path, image_base64, image_filename, image_upload_id, image_site_path, file_path, file_base64, file_filename, file_upload_id, file_site_path, image_paths, image_upload_ids, image_site_paths, images, file_add_cnt, fields."
        -  },
        -  {
        -    "const": "img_edit",
        -    "description": "Replaces the product image in slot img (0 is the main image; the slot must already hold an image). The new image can keep the URL of the old one. Image slots take inline bytes (*_base64 with *_filename), an upload_direct id (*_upload_id), a file already on the site (*_site_path), or a path on the MCP server host (*_path, not reachable for remote agents). Required: id, img, confirm. Optional: image_path, image_base64, image_filename, image_upload_id, image_site_path, file_path, file_base64, file_filename, file_upload_id, file_site_path, fields."
        -  },
        -  {
        -    "const": "variation_update",
        -    "description": "Updates one variation of a product. Required: id, variation_crc. Optional: art, stock, price, price_old, weight, fields."
        -  },
        -  {
        -    "const": "variation_dict_save",
        -    "description": "Creates a variation dictionary (name and values), or updates the dictionary id: a new name and/or the full list of values. Optional: id, name, values, fields."
        -  },
        -  {
        -    "const": "variation_load",
        -    "description": "Loads the variations of a product into its edit form. Required: id. Optional: fields."
        -  },
        -  {
        -    "const": "variation_gen",
        -    "description": "Generates product variations from var_* keys in fields. Required: id, confirm. Optional: fields."
        -  },
        -  {
        -    "const": "variation_edit_save",
        -    "description": "Saves product variations from var_* keys in fields. Required: id. Optional: fields."
        -  },
        -  {
        -    "const": "stock_genall",
        -    "description": "Generates all option sets of a product stock. Required: id. Optional: fields."
        -  },
        -  {
        -    "const": "stock_add",
        -    "description": "Adds an option set to a product stock. Required: id, opt_sel. Optional: fields."
        -  },
        -  {
        -    "const": "stock_save",
        -    "description": "Saves product stock from stock_* keys in fields. Required: id. Optional: fields."
        -  },
        -  {
        -    "const": "basket_add",
        -    "description": "Adds a product to the basket. Required: id. Optional: cnt, opt, now, fields."
        -  },
        -  {
        -    "const": "basket_update",
        -    "description": "Changes the quantity of a basket line. Required: id. Optional: cnt, opt, now, fields."
        -  },
        -  {
        -    "const": "checkout_update",
        -    "description": "Recalculates or changes the unfinished order (mode recalc or change; checkout field_N keys in fields). Required: mode. Optional: fields."
        -  },
        -  {
        -    "const": "checkout_submit",
        -    "description": "Places the order from the basket and sends the order notices. No payment is taken: the order waits for payment by the chosen method. Required: confirm. Optional: payment_id, delivery_id, promo_code, custom_delivery_tax, fields."
        -  },
        -  {
        -    "const": "invoice_hide",
        -    "description": "Moves orders to an order group. Optional: ids, id, hide, fields."
        -  },
        -  {
        -    "const": "invoice_courier",
        -    "description": "Assigns a courier to orders. Required: group_courier. Optional: ids, id, fields."
        -  },
        -  {
        -    "const": "invoice_status",
        -    "description": "Sets the status of orders; a paid status is set without any payment. When the shop returns cancelled payments to the balance, moving an order that a registered buyer actually paid online or from the balance from a paid status (2-8) to new, awaiting payment, cancelled or payment processing credits its total to the internal shop balance of the buyer; the buyer gets nothing back for an order that was never paid online or from the balance. Whether a later return to a paid status debits the credited total depends on the status history of the order: it may not be debited, repeated status changes may credit it again, and with some shop settings it may be debited again. Moving an order between the delivered or completed statuses and any other status also credits or debits the internal balances of the user sellers of its goods and the Telegram shop referrer reward, when those are in use, whether or not the order was paid; a move between delivered and completed changes nothing. Required: status, confirm. Optional: ids, id, fields."
        -  },
        -  {
        -    "const": "invoice_payment",
        -    "description": "Changes the payment method of an order that can still be paid (order hash in order or id); no payment is taken. When the new method is set up so, the order also gets the payment processing status, which can credit or debit internal balances as in invoice_status. The reply may carry the order link and the payment form of the new method for the buyer. Required: payment_id, confirm. Optional: order, id, fields."
        -  },
        -  {
        -    "const": "order_update",
        -    "description": "Changes the goods of an order: quantities, options and prices of its lines, or removes lines (keys in fields). The order total is recalculated, and that total is what may later go back to the balance of the buyer on cancellation. The status and note values are not applied: use invoice_status for the status. Required: order. Optional: status, note, fields."
        -  },
        -  {
        -    "const": "order_add_goods",
        -    "description": "Adds goods to an order. Required: order. Optional: fields."
        -  },
        -  {
        -    "const": "order_delivery_tax",
        -    "description": "Sets a custom delivery cost of an order. Required: order, custom_delivery_tax. Optional: fields."
        -  },
        -  {
        -    "const": "comments_add",
        -    "description": "Adds a product comment (product id in entry_id or id). Required: message. Optional: entry_id, id, pros, cons, parent_id, user_id, subscribe_to_replies, fields."
        -  },
        -  {
        -    "const": "comments_update",
        -    "description": "Updates a product comment. Required: id. Optional: message, pros, cons, fields."
        -  },
        -  {
        -    "const": "set_currency_rate",
        -    "description": "Sets the rate of a shop currency. Required: curr_code, curr_rate. Optional: fields."
        -  }
        -]New value: +[
        +  {
        +    "const": "category_add",
        +    "description": "Creates a category, with an image when an image slot is filled. The category image must be a .jpg, .png or .gif file (.jpeg is renamed to .jpg). Image slots take inline bytes (*_base64 with *_filename), an upload_direct id (*_upload_id), a file already on the site (*_site_path), or a path on the MCP server host (*_path, not reachable for remote agents). Required: name. Optional: pid, parent_id, global_cat, dscr, brief, meta_title, meta_dscr, url, pos, view_groups, add_groups, exclude_from_discount, fields, image_path, image_base64, image_filename, image_upload_id, image_site_path, file_path, file_base64, file_filename, file_upload_id, file_site_path."
        +  },
        +  {
        +    "const": "category_update",
        +    "description": "Updates a category; a filled image slot replaces its image. The category image must be a .jpg, .png or .gif file (.jpeg is renamed to .jpg). The current image is removed before the new one is saved, so a file with such an extension that is not a valid image leaves the category without an image. Image slots take inline bytes (*_base64 with *_filename), an upload_direct id (*_upload_id), a file already on the site (*_site_path), or a path on the MCP server host (*_path, not reachable for remote agents). Required: id. Optional: name, pid, parent_id, global_cat, dscr, brief, meta_title, meta_dscr, url, pos, view_groups, add_groups, exclude_from_discount, fields, image_path, image_base64, image_filename, image_upload_id, image_site_path, file_path, file_base64, file_filename, file_upload_id, file_site_path."
        +  },
        +  {
        +    "const": "category_show",
        +    "description": "Shows a hidden category. Required: id. Optional: fields."
        +  },
        +  {
        +    "const": "category_hide",
        +    "description": "Hides a category. Required: id. Optional: fields."
        +  },
        +  {
        +    "const": "category_image",
        +    "description": "Uploads the image of a category from the first filled image slot. The category image must be a .jpg, .png or .gif file (.jpeg is renamed to .jpg). The current image is removed before the new one is saved, so a file with such an extension that is not a valid image leaves the category without an image. Image slots take inline bytes (*_base64 with *_filename), an upload_direct id (*_upload_id), a file already on the site (*_site_path), or a path on the MCP server host (*_path, not reachable for remote agents). Required: id. Optional: image_path, image_base64, image_filename, image_upload_id, image_site_path, file_path, file_base64, file_filename, file_upload_id, file_site_path, fields."
        +  },
        +  {
        +    "const": "add",
        +    "description": "Creates a product. Required: cat_id, name. Optional: brief, dscr, html_dscr, price, price_in, price_old, stock, art, brand, url, meta_title, meta_dscr, tags, type, cats_add, ch_addcat, unit, weight, warr, undisc, fields."
        +  },
        +  {
        +    "const": "update",
        +    "description": "Updates a product. Required: id. Optional: cat_id, name, brief, dscr, html_dscr, price, price_in, price_old, stock, art, brand, url, meta_title, meta_dscr, tags, type, cats_add, ch_addcat, unit, weight, warr, undisc, fields."
        +  },
        +  {
        +    "const": "hide",
        +    "description": "Hides or shows a product. Required: id. Optional: hide, fields."
        +  },
        +  {
        +    "const": "cnt_save",
        +    "description": "Saves product counters (views, sales, orders, rating, stock). Required: id. Optional: views, solds, ordered, rate_num, rate_sum, stock_q, fields."
        +  },
        +  {
        +    "const": "img_add",
        +    "description": "Adds images to a product. Image slots take inline bytes (*_base64 with *_filename), an upload_direct id (*_upload_id), a file already on the site (*_site_path), or a path on the MCP server host (*_path, not reachable for remote agents). Required: id. Optional: image_path, image_base64, image_filename, image_upload_id, image_site_path, file_path, file_base64, file_filename, file_upload_id, file_site_path, image_paths, image_upload_ids, image_site_paths, images, file_add_cnt, fields."
        +  },
        +  {
        +    "const": "img_edit",
        +    "description": "Replaces the product image in slot img (0 is the main image; the slot must already hold an image). The new image can keep the URL of the old one. Image slots take inline bytes (*_base64 with *_filename), an upload_direct id (*_upload_id), a file already on the site (*_site_path), or a path on the MCP server host (*_path, not reachable for remote agents). Required: id, img, confirm. Optional: image_path, image_base64, image_filename, image_upload_id, image_site_path, file_path, file_base64, file_filename, file_upload_id, file_site_path, fields."
        +  },
        +  {
        +    "const": "variation_update",
        +    "description": "Updates one variation of a product. Required: id, variation_crc. Optional: art, stock, price, price_old, weight, fields."
        +  },
        +  {
        +    "const": "variation_dict_save",
        +    "description": "Creates a variation dictionary (name and values), or updates the dictionary id: a new name and/or the full list of values. Required: id or name. Optional: values, fields."
        +  },
        +  {
        +    "const": "variation_load",
        +    "description": "Loads the variations of a product into its edit form. Required: id. Optional: fields."
        +  },
        +  {
        +    "const": "variation_gen",
        +    "description": "Generates product variations from var_* keys in fields. Required: id, confirm. Optional: fields."
        +  },
        +  {
        +    "const": "variation_edit_save",
        +    "description": "Saves product variations from var_* keys in fields. Required: id. Optional: fields."
        +  },
        +  {
        +    "const": "stock_genall",
        +    "description": "Generates all option sets of a product stock. Required: id. Optional: fields."
        +  },
        +  {
        +    "const": "stock_add",
        +    "description": "Adds an option set to a product stock. Required: id, opt_sel. Optional: fields."
        +  },
        +  {
        +    "const": "stock_save",
        +    "description": "Saves product stock from stock_* keys in fields. Required: id. Optional: fields."
        +  },
        +  {
        +    "const": "basket_add",
        +    "description": "Adds a product to the basket. Required: id. Optional: cnt, opt, now, fields."
        +  },
        +  {
        +    "const": "basket_update",
        +    "description": "Changes the quantity of a basket line. Required: id. Optional: cnt, opt, now, fields."
        +  },
        +  {
        +    "const": "checkout_update",
        +    "description": "Recalculates or changes the unfinished order (mode recalc or change; checkout field_N keys in fields). Required: mode. Optional: fields."
        +  },
        +  {
        +    "const": "checkout_submit",
        +    "description": "Places the order from the basket and sends the order notices. No payment is taken: the order waits for payment by the chosen method. Required: confirm. Optional: payment_id, delivery_id, promo_code, custom_delivery_tax, fields."
        +  },
        +  {
        +    "const": "invoice_hide",
        +    "description": "Moves orders to an order group. Required: ids or id. Optional: hide, fields."
        +  },
        +  {
        +    "const": "invoice_courier",
        +    "description": "Assigns a courier to orders. Required: ids or id, group_courier. Optional: fields."
        +  },
        +  {
        +    "const": "invoice_status",
        +    "description": "Sets the status of orders; a paid status is set without any payment. When the shop returns cancelled payments to the balance, moving an order that a registered buyer actually paid online or from the balance from a paid status (2-8) to new, awaiting payment, cancelled or payment processing credits its total to the internal shop balance of the buyer; the buyer gets nothing back for an order that was never paid online or from the balance. Whether a later return to a paid status debits the credited total depends on the status history of the order: it may not be debited, repeated status changes may credit it again, and with some shop settings it may be debited again. Moving an order between the delivered or completed statuses and any other status also credits or debits the internal balances of the user sellers of its goods and the Telegram shop referrer reward, when those are in use, whether or not the order was paid; a move between delivered and completed changes nothing. Required: ids or id, status, confirm. Optional: fields."
        +  },
        +  {
        +    "const": "invoice_payment",
        +    "description": "Changes the payment method of an order that can still be paid (order hash in order or id); no payment is taken. When the new method is set up so, the order also gets the payment processing status, which can credit or debit internal balances as in invoice_status. The reply may carry the order link and the payment form of the new method for the buyer. Required: order or id, payment_id, confirm. Optional: fields."
        +  },
        +  {
        +    "const": "order_update",
        +    "description": "Changes the goods of an order: quantities, options and prices of its lines, or removes lines (keys in fields). The order total is recalculated, and that total is what may later go back to the balance of the buyer on cancellation. The status and note values are not applied: use invoice_status for the status. Required: order. Optional: status, note, fields."
        +  },
        +  {
        +    "const": "order_add_goods",
        +    "description": "Adds goods to an order. Required: order. Optional: fields."
        +  },
        +  {
        +    "const": "order_delivery_tax",
        +    "description": "Sets a custom delivery cost of an order. Required: order, custom_delivery_tax. Optional: fields."
        +  },
        +  {
        +    "const": "comments_add",
        +    "description": "Adds a product comment (product id in entry_id or id). Required: entry_id or id, message. Optional: pros, cons, parent_id, user_id, subscribe_to_replies, fields."
        +  },
        +  {
        +    "const": "comments_update",
        +    "description": "Updates a product comment. Required: id. Optional: message, pros, cons, fields."
        +  },
        +  {
        +    "const": "set_currency_rate",
        +    "description": "Sets the rate of a shop currency. Required: curr_code, curr_rate. Optional: fields."
        +  }
        +]
      • changedInput schema / properties / ids / description
        Previous value: -"Comma-separated ids (invoice_*, stock_remove)."New value: +"Ids separated by commas (invoice_*: order ids, also separated by |; stock_remove)."
    • Changedsubscriptions_delete1 field changed
      • changedInput schema / properties / action / oneOf
        Previous value: -[
        -  {
        -    "const": "plan_delete",
        -    "description": "Deletes a tariff plan. Required: plan_id, confirm."
        -  },
        -  {
        -    "const": "legacy_item_delete",
        -    "description": "Deletes a legacy tariff (id in id or plan_id). Required: confirm. Optional: id, plan_id."
        -  },
        -  {
        -    "const": "subscription_cancel",
        -    "description": "Cancels a subscription at once: access ends and automatic charges stop. No money is refunded. Required: subscription_id, confirm."
        -  }
        -]New value: +[
        +  {
        +    "const": "plan_delete",
        +    "description": "Deletes a tariff plan. Required: plan_id, confirm."
        +  },
        +  {
        +    "const": "legacy_item_delete",
        +    "description": "Deletes a legacy tariff (id in id or plan_id). Required: id or plan_id, confirm."
        +  },
        +  {
        +    "const": "subscription_cancel",
        +    "description": "Cancels a subscription at once: access ends and automatic charges stop. No money is refunded. Required: subscription_id, confirm."
        +  }
        +]
    • Changedsubscriptions_read1 field changed
      • changedInput schema / properties / action / oneOf
        Previous value: -[
        -  {
        -    "const": "plans_list",
        -    "description": "Lists tariff plans. Optional: offset."
        -  },
        -  {
        -    "const": "plan_get",
        -    "description": "Returns one tariff plan. Required: plan_id."
        -  },
        -  {
        -    "const": "plan_stats",
        -    "description": "Returns statistics of a tariff plan. Required: plan_id."
        -  },
        -  {
        -    "const": "plan_users",
        -    "description": "Lists the users of a tariff plan a page at a time. Brief records by default; detail=full gives complete records. The reply has page, per_page, total, has_more, truncated and next. Required: plan_id. Optional: page, p, per_page, offset, detail, status, expires_before."
        -  },
        -  {
        -    "const": "legacy_items_list",
        -    "description": "Lists legacy tariffs. Optional: offset."
        -  },
        -  {
        -    "const": "legacy_item_get",
        -    "description": "Returns one legacy tariff (id in id or plan_id). Optional: id, plan_id."
        -  },
        -  {
        -    "const": "user_subscriptions",
        -    "description": "Lists the subscriptions of a user a page at a time. Brief records by default; detail=full gives complete records. The reply has page, per_page, total, has_more, truncated and next. Required: user_id. Optional: page, p, per_page, offset, detail, status, expires_before."
        -  },
        -  {
        -    "const": "subscription_get",
        -    "description": "Returns one subscription. Required: subscription_id."
        -  },
        -  {
        -    "const": "access_check",
        -    "description": "Checks whether a user has access through a plan. Optional: user_id, plan_id."
        -  },
        -  {
        -    "const": "subscribers_list",
        -    "description": "Lists subscribers, optionally filtered, a page at a time. Brief records by default; detail=full gives complete records. The reply has page, per_page, total, has_more, truncated and next. Optional: page, p, per_page, offset, detail, query, plan_id, status, expires_before."
        -  },
        -  {
        -    "const": "payments_list",
        -    "description": "Lists payments, optionally filtered, a page at a time. Brief records by default; detail=full gives complete records. The reply has page, per_page, total, has_more, truncated and next. Optional: page, p, per_page, offset, detail, query, user_id, subscription_id, plan_id, status, date_from, date_to."
        -  },
        -  {
        -    "const": "payment_get",
        -    "description": "Returns one payment. Required: payment_id."
        -  }
        -]New value: +[
        +  {
        +    "const": "plans_list",
        +    "description": "Lists tariff plans. Optional: offset."
        +  },
        +  {
        +    "const": "plan_get",
        +    "description": "Returns one tariff plan. Required: plan_id."
        +  },
        +  {
        +    "const": "plan_stats",
        +    "description": "Returns statistics of a tariff plan. Required: plan_id."
        +  },
        +  {
        +    "const": "plan_users",
        +    "description": "Lists the users of a tariff plan a page at a time. Brief records by default; detail=full gives complete records. The reply has page, per_page, total, has_more, truncated and next. Required: plan_id. Optional: page, p, per_page, offset, detail, status, expires_before."
        +  },
        +  {
        +    "const": "legacy_items_list",
        +    "description": "Lists legacy tariffs. Optional: offset."
        +  },
        +  {
        +    "const": "legacy_item_get",
        +    "description": "Returns one legacy tariff (id in id or plan_id). Required: id or plan_id."
        +  },
        +  {
        +    "const": "user_subscriptions",
        +    "description": "Lists the subscriptions of a user a page at a time. Brief records by default; detail=full gives complete records. The reply has page, per_page, total, has_more, truncated and next. Required: user_id. Optional: page, p, per_page, offset, detail, status, expires_before."
        +  },
        +  {
        +    "const": "subscription_get",
        +    "description": "Returns one subscription. Required: subscription_id."
        +  },
        +  {
        +    "const": "access_check",
        +    "description": "Checks whether a user has access through a plan. Required: user_id, plan_id."
        +  },
        +  {
        +    "const": "subscribers_list",
        +    "description": "Lists subscribers, optionally filtered, a page at a time. Brief records by default; detail=full gives complete records. The reply has page, per_page, total, has_more, truncated and next. Optional: page, p, per_page, offset, detail, query, plan_id, status, expires_before."
        +  },
        +  {
        +    "const": "payments_list",
        +    "description": "Lists payments, optionally filtered, a page at a time. Brief records by default; detail=full gives complete records. The reply has page, per_page, total, has_more, truncated and next. Optional: page, p, per_page, offset, detail, query, user_id, subscription_id, plan_id, status, date_from, date_to."
        +  },
        +  {
        +    "const": "payment_get",
        +    "description": "Returns one payment. Required: payment_id."
        +  }
        +]
    • Changedsubscriptions_write1 field changed
      • changedInput schema / properties / action / oneOf
        Previous value: -[
        -  {
        -    "const": "plan_add",
        -    "description": "Creates a tariff plan. Optional: title, description, type, price, price_old, is_discount, is_advantage, interval, period, trial_interval, group_to, group_back, text_advantage, advantage_items, fields."
        -  },
        -  {
        -    "const": "plan_update",
        -    "description": "Updates a tariff plan. Required: plan_id. Optional: title, description, type, price, price_old, is_discount, is_advantage, interval, period, trial_interval, group_to, group_back, text_advantage, advantage_items, fields."
        -  },
        -  {
        -    "const": "plan_enable",
        -    "description": "Enables a tariff plan. Required: plan_id."
        -  },
        -  {
        -    "const": "plan_disable",
        -    "description": "Disables a tariff plan. Required: plan_id."
        -  },
        -  {
        -    "const": "legacy_item_add",
        -    "description": "Creates a legacy tariff. Optional: title, description, type, price, price_old, is_discount, is_advantage, interval, period, trial_interval, group_to, group_back, text_advantage, advantage_items, fields."
        -  },
        -  {
        -    "const": "legacy_item_update",
        -    "description": "Updates a legacy tariff (id in id or plan_id). Optional: id, plan_id, title, description, type, price, price_old, is_discount, is_advantage, interval, period, trial_interval, group_to, group_back, text_advantage, advantage_items, fields."
        -  },
        -  {
        -    "const": "subscription_create",
        -    "description": "Creates an unpaid subscription of a user to a plan. Instead of a new one it reuses the unpaid subscription of the user to this plan (for a recurring plan also a paused or expired one, which keeps its status), refreshes it from the current plan and clears its saved payment method, so its auto-renewal is lost. Refused when the user has an active or trial subscription to any plan (unless the requested plan is a donation plan). Gives no access, charges nothing and records no payment. Required: user_id, plan_id. Optional: fields."
        -  },
        -  {
        -    "const": "subscription_grant",
        -    "description": "Grants a user paid access to a plan without any payment: a subscription is created, or an unpaid one of the user to this plan (for a recurring plan also a paused or expired one) is reused and refreshed from the plan, and it is activated at once for one plan period (unlimited when the plan has no period). The user is moved to the plan group, and the user and the site owner are notified. No payment is recorded. Refused when the user has an active or trial subscription to any plan (unless the requested plan is a donation plan). Required: user_id, plan_id, confirm. Optional: fields."
        -  },
        -  {
        -    "const": "subscription_trial",
        -    "description": "Starts a free trial of a recurring plan that has trial days: the subscription gets the trial status for trial_interval days without a card or any payment. The user group is not changed. Refused when the user already has this plan active, in trial or paused, or has an active or trial subscription to any other plan. Required: user_id, plan_id. Optional: fields."
        -  },
        -  {
        -    "const": "subscription_renew",
        -    "description": "Extends a subscription by one plan period without payment and without a payment record: from its end date, or from now when it has ended. The subscription becomes active and the user is moved to the plan group, even if it was unpaid, in trial or paused. A cancelled one is refused. When the subscription has a saved payment method, automatic charges are scheduled again, even if auto-renewal was turned off. Required: subscription_id."
        -  },
        -  {
        -    "const": "subscription_change_plan",
        -    "description": "Moves a subscription to another plan at once: the new price, period and group (for an active or trial subscription) apply now, without extra payment, refund or price recalculation, and the end date stays. Auto-renewal is kept when the new plan is recurring at the same price, and later charges then follow the new plan period; otherwise it is turned off and the saved payment method is removed. PayPal subscriptions are refused. Required: subscription_id, plan_id. Optional: fields."
        -  },
        -  {
        -    "const": "subscription_pause",
        -    "description": "Pauses a subscription. Required: subscription_id."
        -  },
        -  {
        -    "const": "subscription_resume",
        -    "description": "Resumes a paused subscription that has not ended: the user is moved back to the plan group, and automatic charges of a saved payment method are scheduled again, even if auto-renewal was turned off before the pause; the next charge may come within the hour when the period ends soon. Required: subscription_id."
        -  },
        -  {
        -    "const": "subscription_autorenew_disable",
        -    "description": "Turns off auto-renewal of a subscription. Required: subscription_id."
        -  },
        -  {
        -    "const": "payment_create",
        -    "description": "Records an unpaid payment of a subscription in the module accounts only: nothing is charged, no payment system is contacted, and the subscription does not change. amount is in minor currency units; the payment method must be enabled on the site. Required: subscription_id, amount. Optional: payment_method_id, currency, transaction_id, fields."
        -  },
        -  {
        -    "const": "payment_confirm",
        -    "description": "Marks an unpaid or awaiting payment as paid without any check that money was received; nothing is charged. The subscription is activated and extended by one plan period, the user is moved to the plan group, and the payment counts in paid totals (plan_stats). The amount is not checked against the plan price. When the subscription has a saved payment method, automatic charges are scheduled again, even if auto-renewal was turned off; the next charge may come within the hour when the plan period is short. Required: payment_id, confirm."
        -  }
        -]New value: +[
        +  {
        +    "const": "plan_add",
        +    "description": "Creates a tariff plan. Required: title. Optional: description, type, price, price_old, is_discount, is_advantage, interval, period, trial_interval, group_to, group_back, text_advantage, advantage_items, fields."
        +  },
        +  {
        +    "const": "plan_update",
        +    "description": "Updates a tariff plan. Required: plan_id. Optional: title, description, type, price, price_old, is_discount, is_advantage, interval, period, trial_interval, group_to, group_back, text_advantage, advantage_items, fields."
        +  },
        +  {
        +    "const": "plan_enable",
        +    "description": "Enables a tariff plan. Required: plan_id."
        +  },
        +  {
        +    "const": "plan_disable",
        +    "description": "Disables a tariff plan. Required: plan_id."
        +  },
        +  {
        +    "const": "legacy_item_add",
        +    "description": "Creates a legacy tariff. Required: title. Optional: description, type, price, price_old, is_discount, is_advantage, interval, period, trial_interval, group_to, group_back, text_advantage, advantage_items, fields."
        +  },
        +  {
        +    "const": "legacy_item_update",
        +    "description": "Updates a legacy tariff (id in id or plan_id). Required: id or plan_id. Optional: title, description, type, price, price_old, is_discount, is_advantage, interval, period, trial_interval, group_to, group_back, text_advantage, advantage_items, fields."
        +  },
        +  {
        +    "const": "subscription_create",
        +    "description": "Creates an unpaid subscription of a user to a plan. Instead of a new one it reuses the unpaid subscription of the user to this plan (for a recurring plan also a paused or expired one, which keeps its status), refreshes it from the current plan and clears its saved payment method, so its auto-renewal is lost. Refused when the user has an active or trial subscription to any plan (unless the requested plan is a donation plan). Gives no access, charges nothing and records no payment. Required: user_id, plan_id. Optional: fields."
        +  },
        +  {
        +    "const": "subscription_grant",
        +    "description": "Grants a user paid access to a plan without any payment: a subscription is created, or an unpaid one of the user to this plan (for a recurring plan also a paused or expired one) is reused and refreshed from the plan, and it is activated at once for one plan period (unlimited when the plan has no period). The user is moved to the plan group, and the user and the site owner are notified. No payment is recorded. Refused when the user has an active or trial subscription to any plan (unless the requested plan is a donation plan). Required: user_id, plan_id, confirm. Optional: fields."
        +  },
        +  {
        +    "const": "subscription_trial",
        +    "description": "Starts a free trial of a recurring plan that has trial days: the subscription gets the trial status for trial_interval days without a card or any payment. The user group is not changed. Refused when the user already has this plan active, in trial or paused, or has an active or trial subscription to any other plan. Required: user_id, plan_id. Optional: fields."
        +  },
        +  {
        +    "const": "subscription_renew",
        +    "description": "Extends a subscription by one plan period without payment and without a payment record: from its end date, or from now when it has ended. The subscription becomes active and the user is moved to the plan group, even if it was unpaid, in trial or paused. A cancelled one is refused. When the subscription has a saved payment method, automatic charges are scheduled again, even if auto-renewal was turned off. Required: subscription_id."
        +  },
        +  {
        +    "const": "subscription_change_plan",
        +    "description": "Moves a subscription to another plan at once: the new price, period and group (for an active or trial subscription) apply now, without extra payment, refund or price recalculation, and the end date stays. Auto-renewal is kept when the new plan is recurring at the same price, and later charges then follow the new plan period; otherwise it is turned off and the saved payment method is removed. PayPal subscriptions are refused. Required: subscription_id, plan_id. Optional: fields."
        +  },
        +  {
        +    "const": "subscription_pause",
        +    "description": "Pauses a subscription. Required: subscription_id."
        +  },
        +  {
        +    "const": "subscription_resume",
        +    "description": "Resumes a paused subscription that has not ended: the user is moved back to the plan group, and automatic charges of a saved payment method are scheduled again, even if auto-renewal was turned off before the pause; the next charge may come within the hour when the period ends soon. Required: subscription_id."
        +  },
        +  {
        +    "const": "subscription_autorenew_disable",
        +    "description": "Turns off auto-renewal of a subscription. Required: subscription_id."
        +  },
        +  {
        +    "const": "payment_create",
        +    "description": "Records an unpaid payment of a subscription in the module accounts only: nothing is charged, no payment system is contacted, and the subscription does not change. amount is in minor currency units; the payment method must be enabled on the site. Required: subscription_id, amount. Optional: payment_method_id, currency, transaction_id, fields."
        +  },
        +  {
        +    "const": "payment_confirm",
        +    "description": "Marks an unpaid or awaiting payment as paid without any check that money was received; nothing is charged. The subscription is activated and extended by one plan period, the user is moved to the plan group, and the payment counts in paid totals (plan_stats). The amount is not checked against the plan price. When the subscription has a saved payment method, automatic charges are scheduled again, even if auto-renewal was turned off; the next charge may come within the hour when the plan period is short. Required: payment_id, confirm."
        +  }
        +]
    • Changedtemplates_read1 field changed
      • changedInput schema / properties / action / oneOf
        Previous value: -[
        -  {
        -    "const": "list_modules",
        -    "description": "Lists the modules that have templates, with their template ids. Optional: offset."
        -  },
        -  {
        -    "const": "get_variables",
        -    "description": "Returns a template together with the variables available in it. Required: module_id, template_id."
        -  },
        -  {
        -    "const": "read_template",
        -    "description": "Returns the template code and its variables. Required: module_id, template_id."
        -  },
        -  {
        -    "const": "validate_template",
        -    "description": "Checks a full template body (content or html_content) or a code_search/code_paste patch with the same rules as a save. Nothing is saved and no backup is made. Required: module_id, template_id. Optional: content, html_content, code_search, code_paste."
        -  },
        -  {
        -    "const": "list_backups",
        -    "description": "Lists template backups. Optional: offset."
        -  },
        -  {
        -    "const": "get_reference",
        -    "description": "Returns the template variables reference (markdown)."
        -  },
        -  {
        -    "const": "get_guide",
        -    "description": "Returns the template editing guide (markdown)."
        -  },
        -  {
        -    "const": "get_backup_guide",
        -    "description": "Returns the template backup guide (markdown)."
        -  },
        -  {
        -    "const": "menu_list",
        -    "description": "Lists site menus. Optional: offset."
        -  },
        -  {
        -    "const": "menu_get",
        -    "description": "Returns one menu with its items. Required: menu_id."
        -  },
        -  {
        -    "const": "mail_list_forms",
        -    "description": "Lists mail forms. Optional: offset."
        -  },
        -  {
        -    "const": "mail_get_form",
        -    "description": "Returns one mail form. Required: mail_form_id."
        -  },
        -  {
        -    "const": "mail_list_fields",
        -    "description": "Lists the fields of a mail form. Required: mail_form_id. Optional: offset."
        -  },
        -  {
        -    "const": "mail_get_template",
        -    "description": "Returns the notification email template of a mail form. Required: mail_form_id."
        -  },
        -  {
        -    "const": "page_list",
        -    "description": "Lists site pages a page at a time. Brief pages by default, without their content; detail=full gives complete pages, page_get one complete page. The reply has page, per_page, total, has_more, truncated and next. Optional: page, per_page, offset, detail, page_page, page_per_page."
        -  },
        -  {
        -    "const": "page_get",
        -    "description": "Returns one site page. Required: page_id."
        -  }
        -]New value: +[
        +  {
        +    "const": "list_modules",
        +    "description": "Lists the modules that have templates, with their template ids. Optional: offset."
        +  },
        +  {
        +    "const": "get_variables",
        +    "description": "Returns a template together with the variables available in it. Required: module_id, template_id."
        +  },
        +  {
        +    "const": "read_template",
        +    "description": "Returns the template code and its variables. Required: module_id, template_id."
        +  },
        +  {
        +    "const": "validate_template",
        +    "description": "Checks a full template body (content or html_content) or a code_search/code_paste patch with the same rules as a save. Nothing is saved and no backup is made. Required: module_id, template_id, content or html_content or code_search. Optional: code_paste."
        +  },
        +  {
        +    "const": "list_backups",
        +    "description": "Lists template backups. Optional: offset."
        +  },
        +  {
        +    "const": "get_reference",
        +    "description": "Returns the template variables reference (markdown)."
        +  },
        +  {
        +    "const": "get_guide",
        +    "description": "Returns the template editing guide (markdown)."
        +  },
        +  {
        +    "const": "get_backup_guide",
        +    "description": "Returns the template backup guide (markdown)."
        +  },
        +  {
        +    "const": "menu_list",
        +    "description": "Lists site menus. Optional: offset."
        +  },
        +  {
        +    "const": "menu_get",
        +    "description": "Returns one menu with its items. Required: menu_id."
        +  },
        +  {
        +    "const": "mail_list_forms",
        +    "description": "Lists mail forms. Optional: offset."
        +  },
        +  {
        +    "const": "mail_get_form",
        +    "description": "Returns one mail form. Required: mail_form_id."
        +  },
        +  {
        +    "const": "mail_list_fields",
        +    "description": "Lists the fields of a mail form. Required: mail_form_id. Optional: offset."
        +  },
        +  {
        +    "const": "mail_get_template",
        +    "description": "Returns the notification email template of a mail form. Required: mail_form_id."
        +  },
        +  {
        +    "const": "page_list",
        +    "description": "Lists site pages a page at a time. Brief pages by default, without their content; detail=full gives complete pages, page_get one complete page. The reply has page, per_page, total, has_more, truncated and next. Optional: page, per_page, offset, detail, page_page, page_per_page."
        +  },
        +  {
        +    "const": "page_get",
        +    "description": "Returns one site page. Required: page_id."
        +  }
        +]
    • Changedtemplates_write1 field changed
      • changedInput schema / properties / action / oneOf
        Previous value: -[
        -  {
        -    "const": "update_template",
        -    "description": "Replaces the whole template. After validation an automatic backup (rotated) is made; the save is refused if the backup fails, and the result carries backup.id. Required: module_id, template_id, html_content."
        -  },
        -  {
        -    "const": "patch_template",
        -    "description": "Replaces one exact fragment of a template with code_paste. Makes the same automatic backup as update_template. Required: module_id, template_id, code_search, code_paste."
        -  },
        -  {
        -    "const": "create_backup",
        -    "description": "Makes a manual template backup (never rotated; refused with LIMIT_REACHED when the limit is reached) and returns backup.id."
        -  },
        -  {
        -    "const": "gblock_create",
        -    "description": "Creates or replaces a global block (block id in id or gblock_id). Optional: id, gblock_id, content, pda."
        -  },
        -  {
        -    "const": "menu_create",
        -    "description": "Creates a menu. Required: title. Optional: layout."
        -  },
        -  {
        -    "const": "menu_update",
        -    "description": "Changes the title or layout of a menu. Required: menu_id. Optional: title, layout."
        -  },
        -  {
        -    "const": "menu_update_items",
        -    "description": "Replaces the items of a menu. The text of an item goes in title. Required: menu_id, items."
        -  },
        -  {
        -    "const": "mail_create_form",
        -    "description": "Creates a mail form. Required: mail_name, mail_emails. Optional: mail_rez."
        -  },
        -  {
        -    "const": "mail_update_form",
        -    "description": "Updates a mail form. Required: mail_form_id. Optional: mail_name, mail_emails, mail_rez."
        -  },
        -  {
        -    "const": "mail_add_field",
        -    "description": "Adds a field to a mail form. Required: mail_form_id, mail_field_type, mail_name. Optional: mail_required, mail_values."
        -  },
        -  {
        -    "const": "mail_update_field",
        -    "description": "Updates a mail form field. Required: mail_form_id, mail_field_id. Optional: mail_field_type, mail_name, mail_required, mail_values."
        -  },
        -  {
        -    "const": "mail_move_field",
        -    "description": "Moves a mail form field up or down. Required: mail_form_id, mail_field_id, mail_direction."
        -  },
        -  {
        -    "const": "mail_save_template",
        -    "description": "Saves the notification email template of a mail form. Required: mail_form_id, mail_tmpl."
        -  },
        -  {
        -    "const": "page_add",
        -    "description": "Creates a site page. Optional: page_name, page_message, page_parent_id, page_pending, page_owntmpl, page_tmpl, page_ownurl, page_access_all, page_meta_title, page_meta_description, page_meta_keywords, page_other1, page_other2, page_other3, page_other4, page_other5."
        -  },
        -  {
        -    "const": "page_update",
        -    "description": "Updates a site page. Required: page_id. Optional: page_name, page_message, page_parent_id, page_pending, page_owntmpl, page_tmpl, page_ownurl, page_access_all, page_meta_title, page_meta_description, page_meta_keywords, page_other1, page_other2, page_other3, page_other4, page_other5."
        -  }
        -]New value: +[
        +  {
        +    "const": "update_template",
        +    "description": "Replaces the whole template. After validation an automatic backup (rotated) is made; the save is refused if the backup fails, and the result carries backup.id. Required: module_id, template_id, html_content."
        +  },
        +  {
        +    "const": "patch_template",
        +    "description": "Replaces one exact fragment of a template with code_paste. Makes the same automatic backup as update_template. Required: module_id, template_id, code_search, code_paste."
        +  },
        +  {
        +    "const": "create_backup",
        +    "description": "Makes a manual template backup (never rotated; refused with LIMIT_REACHED when the limit is reached) and returns backup.id."
        +  },
        +  {
        +    "const": "gblock_create",
        +    "description": "Creates a global block (block id in id or gblock_id: Latin letters, cut to 10 and upper-cased). Without content the block is created empty. A block that already exists is refused (ALREADY_EXISTS). Required: id or gblock_id. Optional: content, pda."
        +  },
        +  {
        +    "const": "menu_create",
        +    "description": "Creates a menu. Required: title. Optional: layout."
        +  },
        +  {
        +    "const": "menu_update",
        +    "description": "Changes the title or layout of a menu. Required: menu_id. Optional: title, layout."
        +  },
        +  {
        +    "const": "menu_update_items",
        +    "description": "Replaces the items of a menu. The text of an item goes in title. Required: menu_id, items."
        +  },
        +  {
        +    "const": "mail_create_form",
        +    "description": "Creates a mail form. Required: mail_name, mail_emails. Optional: mail_rez."
        +  },
        +  {
        +    "const": "mail_update_form",
        +    "description": "Updates a mail form. Required: mail_form_id. Optional: mail_name, mail_emails, mail_rez."
        +  },
        +  {
        +    "const": "mail_add_field",
        +    "description": "Adds a field to a mail form. Required: mail_form_id, mail_field_type, mail_name. Optional: mail_required, mail_values."
        +  },
        +  {
        +    "const": "mail_update_field",
        +    "description": "Updates a mail form field. Required: mail_form_id, mail_field_id. Optional: mail_field_type, mail_name, mail_required, mail_values."
        +  },
        +  {
        +    "const": "mail_move_field",
        +    "description": "Moves a mail form field up or down. Required: mail_form_id, mail_field_id, mail_direction."
        +  },
        +  {
        +    "const": "mail_save_template",
        +    "description": "Saves the notification email template of a mail form. Required: mail_form_id, mail_tmpl."
        +  },
        +  {
        +    "const": "page_add",
        +    "description": "Creates a site page. Required: page_name. Optional: page_message, page_parent_id, page_pending, page_owntmpl, page_tmpl, page_ownurl, page_access_all, page_meta_title, page_meta_description, page_meta_keywords, page_other1, page_other2, page_other3, page_other4, page_other5."
        +  },
        +  {
        +    "const": "page_update",
        +    "description": "Updates a site page. Required: page_id. Optional: page_name, page_message, page_parent_id, page_pending, page_owntmpl, page_tmpl, page_ownurl, page_access_all, page_meta_title, page_meta_description, page_meta_keywords, page_other1, page_other2, page_other3, page_other4, page_other5."
        +  }
        +]
    • Changedtmaker_delete1 field changed
      • changedInput schema / properties / action / oneOf
        Previous value: -[
        -  {
        -    "const": "project_delete",
        -    "description": "Deletes a saved project (id in project_id or id). Required: confirm. Optional: project_id, id."
        -  }
        -]New value: +[
        +  {
        +    "const": "project_delete",
        +    "description": "Deletes a saved project (id in project_id or id). Required: project_id or id, confirm."
        +  }
        +]
    • Changedtmaker_read1 field changed
      • changedInput schema / properties / action / oneOf
        Previous value: -[
        -  {
        -    "const": "skeleton_guide",
        -    "description": "Returns the skeleton guide (markdown)."
        -  },
        -  {
        -    "const": "skeleton_rules",
        -    "description": "Returns the placeholder codes allowed in skeleton HTML. Optional: offset."
        -  },
        -  {
        -    "const": "designs_list",
        -    "description": "Lists standard designs. Optional: offset."
        -  },
        -  {
        -    "const": "design_get",
        -    "description": "Returns one standard design (id in design_id or id). Optional: design_id, id."
        -  },
        -  {
        -    "const": "project_list",
        -    "description": "Lists saved projects. Optional: offset."
        -  },
        -  {
        -    "const": "project_get",
        -    "description": "Returns one saved project (id in project_id or id). Optional: project_id, id."
        -  },
        -  {
        -    "const": "skeleton_validate",
        -    "description": "Checks skeleton HTML without saving it. Required: tmpl."
        -  }
        -]New value: +[
        +  {
        +    "const": "skeleton_guide",
        +    "description": "Returns the skeleton guide (markdown)."
        +  },
        +  {
        +    "const": "skeleton_rules",
        +    "description": "Returns the placeholder codes allowed in skeleton HTML. Optional: offset."
        +  },
        +  {
        +    "const": "designs_list",
        +    "description": "Lists standard designs. Optional: offset."
        +  },
        +  {
        +    "const": "design_get",
        +    "description": "Returns one standard design (id in design_id or id). Required: design_id or id."
        +  },
        +  {
        +    "const": "project_list",
        +    "description": "Lists saved projects. Optional: offset."
        +  },
        +  {
        +    "const": "project_get",
        +    "description": "Returns one saved project (id in project_id or id). Required: project_id or id."
        +  },
        +  {
        +    "const": "skeleton_validate",
        +    "description": "Checks skeleton HTML without saving it. Required: tmpl."
        +  }
        +]
    • Changedusers_delete1 field changed
      • changedInput schema / properties / action / oneOf
        Previous value: -[
        -  {
        -    "const": "delete",
        -    "description": "Deletes a user (login in nick or user). Required: confirm. Optional: nick, user."
        -  },
        -  {
        -    "const": "group_delete",
        -    "description": "Deletes a user group (group id in id or gid) and moves its members to the group nid. Required: confirm. Optional: id, gid, nid."
        -  }
        -]New value: +[
        +  {
        +    "const": "delete",
        +    "description": "Deletes a user (login in nick or user). Required: nick or user, confirm."
        +  },
        +  {
        +    "const": "group_delete",
        +    "description": "Deletes a user group (group id in id or gid) and moves its members to the group nid. Required: id or gid, confirm. Optional: nid."
        +  }
        +]
    • Changedusers_read1 field changed
      • changedInput schema / properties / action / oneOf
        Previous value: -[
        -  {
        -    "const": "list",
        -    "description": "Lists site users page by page, optionally filtered by login, id or email. Brief users by default; detail=full gives complete profiles, get one complete user. The reply has page, per_page, total, has_more, truncated and next. Optional: page, per_page, offset, detail, nick, user, user_id, email."
        -  },
        -  {
        -    "const": "get",
        -    "description": "Returns one user by id, login or email. Optional: user_id, nick, user, email."
        -  },
        -  {
        -    "const": "groups",
        -    "description": "Lists user groups. Optional: offset."
        -  },
        -  {
        -    "const": "groups_list",
        -    "description": "Lists user groups (same as groups). Optional: offset."
        -  },
        -  {
        -    "const": "groups_rights",
        -    "description": "Lists the permission codes that a group can have. Optional: offset."
        -  },
        -  {
        -    "const": "group_permissions",
        -    "description": "Returns the permissions of one group (group id in id or gid). Optional: id, gid."
        -  },
        -  {
        -    "const": "ranks",
        -    "description": "Lists user ranks. Optional: offset."
        -  },
        -  {
        -    "const": "fields",
        -    "description": "Lists user profile fields. Optional: offset."
        -  }
        -]New value: +[
        +  {
        +    "const": "list",
        +    "description": "Lists site users page by page, optionally filtered by login, id or email. Brief users by default; detail=full gives complete profiles, get one complete user. The reply has page, per_page, total, has_more, truncated and next. Optional: page, per_page, offset, detail, nick, user, user_id, email."
        +  },
        +  {
        +    "const": "get",
        +    "description": "Returns one user by id, login or email. Required: user_id or nick or user or email."
        +  },
        +  {
        +    "const": "groups",
        +    "description": "Lists user groups. Optional: offset."
        +  },
        +  {
        +    "const": "groups_list",
        +    "description": "Lists user groups (same as groups). Optional: offset."
        +  },
        +  {
        +    "const": "groups_rights",
        +    "description": "Lists the permission codes that a group can have. Optional: offset."
        +  },
        +  {
        +    "const": "group_permissions",
        +    "description": "Returns the permissions of one group (group id in id or gid). Required: id or gid."
        +  },
        +  {
        +    "const": "ranks",
        +    "description": "Lists user ranks. Optional: offset."
        +  },
        +  {
        +    "const": "fields",
        +    "description": "Lists user profile fields. Optional: offset."
        +  }
        +]
    • Changedusers_write1 field changed
      • changedInput schema / properties / action / oneOf
        Previous value: -[
        -  {
        -    "const": "add",
        -    "description": "Creates a user (login in nick or user). The full name goes in name (or fields.full_name). Required: password, email, name. Optional: nick, user, fields."
        -  },
        -  {
        -    "const": "register",
        -    "description": "Creates a user (same as add). Required: password, email, name. Optional: nick, user, fields."
        -  },
        -  {
        -    "const": "update",
        -    "description": "Updates a user profile: values that are not passed keep their stored values, an empty string clears a value. The full name goes in name (or fields.full_name). Required: user_id. Optional: name, email, fields."
        -  },
        -  {
        -    "const": "chlogin",
        -    "description": "Changes the login of a user. Required: user_id, login."
        -  },
        -  {
        -    "const": "chgroup",
        -    "description": "Moves a user to another group. Required: user_id, gid."
        -  },
        -  {
        -    "const": "chpass",
        -    "description": "Sets a new password for a user. Required: user_id, password, confirm."
        -  },
        -  {
        -    "const": "group_add",
        -    "description": "Creates a user group. Required: name. Optional: fields."
        -  },
        -  {
        -    "const": "group_update",
        -    "description": "Updates a user group (group id in id or gid). Optional: id, gid, name, fields."
        -  }
        -]New value: +[
        +  {
        +    "const": "add",
        +    "description": "Creates a user (login in nick or user). The full name goes in name (or fields.full_name). Required: password, email, name. Optional: nick, user, fields."
        +  },
        +  {
        +    "const": "register",
        +    "description": "Creates a user (same as add). Required: password, email, name. Optional: nick, user, fields."
        +  },
        +  {
        +    "const": "update",
        +    "description": "Updates a user profile: values that are not passed keep their stored values, an empty string clears a value. The full name goes in name (or fields.full_name). Required: user_id. Optional: name, email, fields."
        +  },
        +  {
        +    "const": "chlogin",
        +    "description": "Changes the login of a user. Required: user_id, login."
        +  },
        +  {
        +    "const": "chgroup",
        +    "description": "Moves a user to another group. Required: user_id, gid."
        +  },
        +  {
        +    "const": "chpass",
        +    "description": "Sets a new password for a user. Required: user_id, password, confirm."
        +  },
        +  {
        +    "const": "group_add",
        +    "description": "Creates a user group. Required: name. Optional: fields."
        +  },
        +  {
        +    "const": "group_update",
        +    "description": "Updates a user group (group id in id or gid). Required: id or gid. Optional: name, fields."
        +  }
        +]
  5. 3 tool updates
    • Changedshop_write4 fields changed
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "category_add",
        -  "category_update",
        -  "category_show",
        -  "category_hide",
        -  "category_image",
        -  "add",
        -  "update",
        -  "hide",
        -  "cnt_save",
        -  "img_add",
        -  "img_edit",
        -  "variation_update",
        -  "variation_dict_save",
        -  "variation_load",
        -  "variation_gen",
        -  "variation_edit_save",
        -  "stock_genall",
        -  "stock_add",
        -  "stock_save",
        -  "basket_add",
        -  "basket_update",
        -  "checkout_update",
        -  "checkout_submit",
        -  "invoice_hide",
        -  "invoice_courier",
        -  "invoice_status",
        -  "invoice_payment",
        -  "order_update",
        -  "order_add_goods",
        -  "order_delivery_tax",
        -  "comments_add",
        -  "comments_update",
        -  "set_currency_rate",
        -  "balance_change",
        -  "balance_set"
        -]New value: +[
        +  "category_add",
        +  "category_update",
        +  "category_show",
        +  "category_hide",
        +  "category_image",
        +  "add",
        +  "update",
        +  "hide",
        +  "cnt_save",
        +  "img_add",
        +  "img_edit",
        +  "variation_update",
        +  "variation_dict_save",
        +  "variation_load",
        +  "variation_gen",
        +  "variation_edit_save",
        +  "stock_genall",
        +  "stock_add",
        +  "stock_save",
        +  "basket_add",
        +  "basket_update",
        +  "checkout_update",
        +  "checkout_submit",
        +  "invoice_hide",
        +  "invoice_courier",
        +  "invoice_status",
        +  "invoice_payment",
        +  "order_update",
        +  "order_add_goods",
        +  "order_delivery_tax",
        +  "comments_add",
        +  "comments_update",
        +  "set_currency_rate"
        +]
      • changedInput schema / properties / action / oneOf
        Previous value: -[
        -  {
        -    "const": "category_add",
        -    "description": "Creates a category, with an image when an image slot is filled. The category image must be a .jpg, .png or .gif file (.jpeg is renamed to .jpg). Image slots take inline bytes (*_base64 with *_filename), an upload_direct id (*_upload_id), a file already on the site (*_site_path), or a path on the MCP server host (*_path, not reachable for remote agents). Optional: name, pid, parent_id, global_cat, dscr, brief, meta_title, meta_dscr, url, pos, view_groups, add_groups, exclude_from_discount, fields, image_path, image_base64, image_filename, image_upload_id, image_site_path, file_path, file_base64, file_filename, file_upload_id, file_site_path."
        -  },
        -  {
        -    "const": "category_update",
        -    "description": "Updates a category; a filled image slot replaces its image. The category image must be a .jpg, .png or .gif file (.jpeg is renamed to .jpg). The current image is removed before the new one is saved, so a file with such an extension that is not a valid image leaves the category without an image. Image slots take inline bytes (*_base64 with *_filename), an upload_direct id (*_upload_id), a file already on the site (*_site_path), or a path on the MCP server host (*_path, not reachable for remote agents). Required: id. Optional: name, pid, parent_id, global_cat, dscr, brief, meta_title, meta_dscr, url, pos, view_groups, add_groups, exclude_from_discount, fields, image_path, image_base64, image_filename, image_upload_id, image_site_path, file_path, file_base64, file_filename, file_upload_id, file_site_path."
        -  },
        -  {
        -    "const": "category_show",
        -    "description": "Shows a hidden category. Required: id. Optional: fields."
        -  },
        -  {
        -    "const": "category_hide",
        -    "description": "Hides a category. Required: id. Optional: fields."
        -  },
        -  {
        -    "const": "category_image",
        -    "description": "Uploads the image of a category from the first filled image slot. The category image must be a .jpg, .png or .gif file (.jpeg is renamed to .jpg). The current image is removed before the new one is saved, so a file with such an extension that is not a valid image leaves the category without an image. Image slots take inline bytes (*_base64 with *_filename), an upload_direct id (*_upload_id), a file already on the site (*_site_path), or a path on the MCP server host (*_path, not reachable for remote agents). Required: id. Optional: image_path, image_base64, image_filename, image_upload_id, image_site_path, file_path, file_base64, file_filename, file_upload_id, file_site_path, fields."
        -  },
        -  {
        -    "const": "add",
        -    "description": "Creates a product. Optional: cat_id, name, brief, dscr, html_dscr, price, price_in, price_old, stock, art, brand, url, meta_title, meta_dscr, tags, type, cats_add, ch_addcat, unit, weight, warr, undisc, fields."
        -  },
        -  {
        -    "const": "update",
        -    "description": "Updates a product. Required: id. Optional: cat_id, name, brief, dscr, html_dscr, price, price_in, price_old, stock, art, brand, url, meta_title, meta_dscr, tags, type, cats_add, ch_addcat, unit, weight, warr, undisc, fields."
        -  },
        -  {
        -    "const": "hide",
        -    "description": "Hides or shows a product. Required: id. Optional: hide, fields."
        -  },
        -  {
        -    "const": "cnt_save",
        -    "description": "Saves product counters (views, sales, orders, rating, stock). Required: id. Optional: views, solds, ordered, rate_num, rate_sum, stock_q, fields."
        -  },
        -  {
        -    "const": "img_add",
        -    "description": "Adds images to a product. Image slots take inline bytes (*_base64 with *_filename), an upload_direct id (*_upload_id), a file already on the site (*_site_path), or a path on the MCP server host (*_path, not reachable for remote agents). Required: id. Optional: image_path, image_base64, image_filename, image_upload_id, image_site_path, file_path, file_base64, file_filename, file_upload_id, file_site_path, image_paths, image_upload_ids, image_site_paths, images, file_add_cnt, fields."
        -  },
        -  {
        -    "const": "img_edit",
        -    "description": "Replaces the product image in slot img (0 is the main image; the slot must already hold an image). The new image can keep the URL of the old one. Image slots take inline bytes (*_base64 with *_filename), an upload_direct id (*_upload_id), a file already on the site (*_site_path), or a path on the MCP server host (*_path, not reachable for remote agents). Required: id, img, confirm. Optional: image_path, image_base64, image_filename, image_upload_id, image_site_path, file_path, file_base64, file_filename, file_upload_id, file_site_path, fields."
        -  },
        -  {
        -    "const": "variation_update",
        -    "description": "Updates one variation of a product. Required: id, variation_crc. Optional: art, stock, price, price_old, weight, fields."
        -  },
        -  {
        -    "const": "variation_dict_save",
        -    "description": "Creates a variation dictionary (name and values), or updates the dictionary id: a new name and/or the full list of values. Optional: id, name, values, fields."
        -  },
        -  {
        -    "const": "variation_load",
        -    "description": "Loads the variations of a product into its edit form. Required: id. Optional: fields."
        -  },
        -  {
        -    "const": "variation_gen",
        -    "description": "Generates product variations from var_* keys in fields. Required: id, confirm. Optional: fields."
        -  },
        -  {
        -    "const": "variation_edit_save",
        -    "description": "Saves product variations from var_* keys in fields. Required: id. Optional: fields."
        -  },
        -  {
        -    "const": "stock_genall",
        -    "description": "Generates all option sets of a product stock. Required: id. Optional: fields."
        -  },
        -  {
        -    "const": "stock_add",
        -    "description": "Adds an option set to a product stock. Required: id, opt_sel. Optional: fields."
        -  },
        -  {
        -    "const": "stock_save",
        -    "description": "Saves product stock from stock_* keys in fields. Required: id. Optional: fields."
        -  },
        -  {
        -    "const": "basket_add",
        -    "description": "Adds a product to the basket. Required: id. Optional: cnt, opt, now, fields."
        -  },
        -  {
        -    "const": "basket_update",
        -    "description": "Changes the quantity of a basket line. Required: id. Optional: cnt, opt, now, fields."
        -  },
        -  {
        -    "const": "checkout_update",
        -    "description": "Recalculates or changes the unfinished order (mode recalc or change; checkout field_N keys in fields). Required: mode. Optional: fields."
        -  },
        -  {
        -    "const": "checkout_submit",
        -    "description": "Places the order from the basket. Required: confirm. Optional: payment_id, delivery_id, promo_code, custom_delivery_tax, fields."
        -  },
        -  {
        -    "const": "invoice_hide",
        -    "description": "Moves orders to an order group. Optional: ids, id, hide, fields."
        -  },
        -  {
        -    "const": "invoice_courier",
        -    "description": "Assigns a courier to orders. Required: group_courier. Optional: ids, id, fields."
        -  },
        -  {
        -    "const": "invoice_status",
        -    "description": "Sets the status of orders. Required: status. Optional: ids, id, fields."
        -  },
        -  {
        -    "const": "invoice_payment",
        -    "description": "Changes the payment method of an order (order hash in order or id). Required: payment_id. Optional: order, id, fields."
        -  },
        -  {
        -    "const": "order_update",
        -    "description": "Changes the goods, status or note of an order. Required: order. Optional: status, note, fields."
        -  },
        -  {
        -    "const": "order_add_goods",
        -    "description": "Adds goods to an order. Required: order. Optional: fields."
        -  },
        -  {
        -    "const": "order_delivery_tax",
        -    "description": "Sets a custom delivery cost of an order. Required: order, custom_delivery_tax. Optional: fields."
        -  },
        -  {
        -    "const": "comments_add",
        -    "description": "Adds a product comment (product id in entry_id or id). Required: message. Optional: entry_id, id, pros, cons, parent_id, user_id, subscribe_to_replies, fields."
        -  },
        -  {
        -    "const": "comments_update",
        -    "description": "Updates a product comment. Required: id. Optional: message, pros, cons, fields."
        -  },
        -  {
        -    "const": "set_currency_rate",
        -    "description": "Sets the rate of a shop currency. Required: curr_code, curr_rate. Optional: fields."
        -  },
        -  {
        -    "const": "balance_change",
        -    "description": "Changes the balance of a user by amount: a positive amount adds to it, a negative one subtracts. A subtraction larger than the current balance is refused. A note goes in fields.comment. Required: user_id, amount, confirm. Optional: fields."
        -  },
        -  {
        -    "const": "balance_set",
        -    "description": "Sets the balance of a user. Required: user_id, amount, confirm. Optional: fields."
        -  }
        -]New value: +[
        +  {
        +    "const": "category_add",
        +    "description": "Creates a category, with an image when an image slot is filled. The category image must be a .jpg, .png or .gif file (.jpeg is renamed to .jpg). Image slots take inline bytes (*_base64 with *_filename), an upload_direct id (*_upload_id), a file already on the site (*_site_path), or a path on the MCP server host (*_path, not reachable for remote agents). Optional: name, pid, parent_id, global_cat, dscr, brief, meta_title, meta_dscr, url, pos, view_groups, add_groups, exclude_from_discount, fields, image_path, image_base64, image_filename, image_upload_id, image_site_path, file_path, file_base64, file_filename, file_upload_id, file_site_path."
        +  },
        +  {
        +    "const": "category_update",
        +    "description": "Updates a category; a filled image slot replaces its image. The category image must be a .jpg, .png or .gif file (.jpeg is renamed to .jpg). The current image is removed before the new one is saved, so a file with such an extension that is not a valid image leaves the category without an image. Image slots take inline bytes (*_base64 with *_filename), an upload_direct id (*_upload_id), a file already on the site (*_site_path), or a path on the MCP server host (*_path, not reachable for remote agents). Required: id. Optional: name, pid, parent_id, global_cat, dscr, brief, meta_title, meta_dscr, url, pos, view_groups, add_groups, exclude_from_discount, fields, image_path, image_base64, image_filename, image_upload_id, image_site_path, file_path, file_base64, file_filename, file_upload_id, file_site_path."
        +  },
        +  {
        +    "const": "category_show",
        +    "description": "Shows a hidden category. Required: id. Optional: fields."
        +  },
        +  {
        +    "const": "category_hide",
        +    "description": "Hides a category. Required: id. Optional: fields."
        +  },
        +  {
        +    "const": "category_image",
        +    "description": "Uploads the image of a category from the first filled image slot. The category image must be a .jpg, .png or .gif file (.jpeg is renamed to .jpg). The current image is removed before the new one is saved, so a file with such an extension that is not a valid image leaves the category without an image. Image slots take inline bytes (*_base64 with *_filename), an upload_direct id (*_upload_id), a file already on the site (*_site_path), or a path on the MCP server host (*_path, not reachable for remote agents). Required: id. Optional: image_path, image_base64, image_filename, image_upload_id, image_site_path, file_path, file_base64, file_filename, file_upload_id, file_site_path, fields."
        +  },
        +  {
        +    "const": "add",
        +    "description": "Creates a product. Optional: cat_id, name, brief, dscr, html_dscr, price, price_in, price_old, stock, art, brand, url, meta_title, meta_dscr, tags, type, cats_add, ch_addcat, unit, weight, warr, undisc, fields."
        +  },
        +  {
        +    "const": "update",
        +    "description": "Updates a product. Required: id. Optional: cat_id, name, brief, dscr, html_dscr, price, price_in, price_old, stock, art, brand, url, meta_title, meta_dscr, tags, type, cats_add, ch_addcat, unit, weight, warr, undisc, fields."
        +  },
        +  {
        +    "const": "hide",
        +    "description": "Hides or shows a product. Required: id. Optional: hide, fields."
        +  },
        +  {
        +    "const": "cnt_save",
        +    "description": "Saves product counters (views, sales, orders, rating, stock). Required: id. Optional: views, solds, ordered, rate_num, rate_sum, stock_q, fields."
        +  },
        +  {
        +    "const": "img_add",
        +    "description": "Adds images to a product. Image slots take inline bytes (*_base64 with *_filename), an upload_direct id (*_upload_id), a file already on the site (*_site_path), or a path on the MCP server host (*_path, not reachable for remote agents). Required: id. Optional: image_path, image_base64, image_filename, image_upload_id, image_site_path, file_path, file_base64, file_filename, file_upload_id, file_site_path, image_paths, image_upload_ids, image_site_paths, images, file_add_cnt, fields."
        +  },
        +  {
        +    "const": "img_edit",
        +    "description": "Replaces the product image in slot img (0 is the main image; the slot must already hold an image). The new image can keep the URL of the old one. Image slots take inline bytes (*_base64 with *_filename), an upload_direct id (*_upload_id), a file already on the site (*_site_path), or a path on the MCP server host (*_path, not reachable for remote agents). Required: id, img, confirm. Optional: image_path, image_base64, image_filename, image_upload_id, image_site_path, file_path, file_base64, file_filename, file_upload_id, file_site_path, fields."
        +  },
        +  {
        +    "const": "variation_update",
        +    "description": "Updates one variation of a product. Required: id, variation_crc. Optional: art, stock, price, price_old, weight, fields."
        +  },
        +  {
        +    "const": "variation_dict_save",
        +    "description": "Creates a variation dictionary (name and values), or updates the dictionary id: a new name and/or the full list of values. Optional: id, name, values, fields."
        +  },
        +  {
        +    "const": "variation_load",
        +    "description": "Loads the variations of a product into its edit form. Required: id. Optional: fields."
        +  },
        +  {
        +    "const": "variation_gen",
        +    "description": "Generates product variations from var_* keys in fields. Required: id, confirm. Optional: fields."
        +  },
        +  {
        +    "const": "variation_edit_save",
        +    "description": "Saves product variations from var_* keys in fields. Required: id. Optional: fields."
        +  },
        +  {
        +    "const": "stock_genall",
        +    "description": "Generates all option sets of a product stock. Required: id. Optional: fields."
        +  },
        +  {
        +    "const": "stock_add",
        +    "description": "Adds an option set to a product stock. Required: id, opt_sel. Optional: fields."
        +  },
        +  {
        +    "const": "stock_save",
        +    "description": "Saves product stock from stock_* keys in fields. Required: id. Optional: fields."
        +  },
        +  {
        +    "const": "basket_add",
        +    "description": "Adds a product to the basket. Required: id. Optional: cnt, opt, now, fields."
        +  },
        +  {
        +    "const": "basket_update",
        +    "description": "Changes the quantity of a basket line. Required: id. Optional: cnt, opt, now, fields."
        +  },
        +  {
        +    "const": "checkout_update",
        +    "description": "Recalculates or changes the unfinished order (mode recalc or change; checkout field_N keys in fields). Required: mode. Optional: fields."
        +  },
        +  {
        +    "const": "checkout_submit",
        +    "description": "Places the order from the basket and sends the order notices. No payment is taken: the order waits for payment by the chosen method. Required: confirm. Optional: payment_id, delivery_id, promo_code, custom_delivery_tax, fields."
        +  },
        +  {
        +    "const": "invoice_hide",
        +    "description": "Moves orders to an order group. Optional: ids, id, hide, fields."
        +  },
        +  {
        +    "const": "invoice_courier",
        +    "description": "Assigns a courier to orders. Required: group_courier. Optional: ids, id, fields."
        +  },
        +  {
        +    "const": "invoice_status",
        +    "description": "Sets the status of orders; a paid status is set without any payment. When the shop returns cancelled payments to the balance, moving an order that a registered buyer actually paid online or from the balance from a paid status (2-8) to new, awaiting payment, cancelled or payment processing credits its total to the internal shop balance of the buyer; the buyer gets nothing back for an order that was never paid online or from the balance. Whether a later return to a paid status debits the credited total depends on the status history of the order: it may not be debited, repeated status changes may credit it again, and with some shop settings it may be debited again. Moving an order between the delivered or completed statuses and any other status also credits or debits the internal balances of the user sellers of its goods and the Telegram shop referrer reward, when those are in use, whether or not the order was paid; a move between delivered and completed changes nothing. Required: status, confirm. Optional: ids, id, fields."
        +  },
        +  {
        +    "const": "invoice_payment",
        +    "description": "Changes the payment method of an order that can still be paid (order hash in order or id); no payment is taken. When the new method is set up so, the order also gets the payment processing status, which can credit or debit internal balances as in invoice_status. The reply may carry the order link and the payment form of the new method for the buyer. Required: payment_id, confirm. Optional: order, id, fields."
        +  },
        +  {
        +    "const": "order_update",
        +    "description": "Changes the goods of an order: quantities, options and prices of its lines, or removes lines (keys in fields). The order total is recalculated, and that total is what may later go back to the balance of the buyer on cancellation. The status and note values are not applied: use invoice_status for the status. Required: order. Optional: status, note, fields."
        +  },
        +  {
        +    "const": "order_add_goods",
        +    "description": "Adds goods to an order. Required: order. Optional: fields."
        +  },
        +  {
        +    "const": "order_delivery_tax",
        +    "description": "Sets a custom delivery cost of an order. Required: order, custom_delivery_tax. Optional: fields."
        +  },
        +  {
        +    "const": "comments_add",
        +    "description": "Adds a product comment (product id in entry_id or id). Required: message. Optional: entry_id, id, pros, cons, parent_id, user_id, subscribe_to_replies, fields."
        +  },
        +  {
        +    "const": "comments_update",
        +    "description": "Updates a product comment. Required: id. Optional: message, pros, cons, fields."
        +  },
        +  {
        +    "const": "set_currency_rate",
        +    "description": "Sets the rate of a shop currency. Required: curr_code, curr_rate. Optional: fields."
        +  }
        +]
      • removedInput schema / properties / amount
        Removed value: -{
        -  "description": "balance_change: signed change, non-zero. balance_set: the new balance, zero or more.",
        -  "type": [
        -    "number",
        -    "string"
        -  ]
        -}
      • changedInput schema / properties / confirm / description
        Previous value: -"Pass true only after the user approves this change. Required by: img_edit, variation_gen, checkout_submit, balance_change, balance_set."New value: +"Pass true only after the user approves this change. Required by: img_edit, variation_gen, checkout_submit, invoice_status, invoice_payment."
    • Changedsubscriptions_delete1 field changed
      • changedInput schema / properties / action / oneOf
        Previous value: -[
        -  {
        -    "const": "plan_delete",
        -    "description": "Deletes a tariff plan. Required: plan_id, confirm."
        -  },
        -  {
        -    "const": "legacy_item_delete",
        -    "description": "Deletes a legacy tariff (id in id or plan_id). Required: confirm. Optional: id, plan_id."
        -  },
        -  {
        -    "const": "subscription_cancel",
        -    "description": "Cancels a subscription. Required: subscription_id, confirm."
        -  }
        -]New value: +[
        +  {
        +    "const": "plan_delete",
        +    "description": "Deletes a tariff plan. Required: plan_id, confirm."
        +  },
        +  {
        +    "const": "legacy_item_delete",
        +    "description": "Deletes a legacy tariff (id in id or plan_id). Required: confirm. Optional: id, plan_id."
        +  },
        +  {
        +    "const": "subscription_cancel",
        +    "description": "Cancels a subscription at once: access ends and automatic charges stop. No money is refunded. Required: subscription_id, confirm."
        +  }
        +]
    • Changedsubscriptions_write3 fields changed
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "plan_add",
        -  "plan_update",
        -  "plan_enable",
        -  "plan_disable",
        -  "legacy_item_add",
        -  "legacy_item_update",
        -  "subscription_create",
        -  "subscription_grant",
        -  "subscription_trial",
        -  "subscription_renew",
        -  "subscription_change_plan",
        -  "subscription_pause",
        -  "subscription_resume",
        -  "subscription_autorenew_enable",
        -  "subscription_autorenew_disable",
        -  "payment_create",
        -  "payment_confirm",
        -  "payment_refund"
        -]New value: +[
        +  "plan_add",
        +  "plan_update",
        +  "plan_enable",
        +  "plan_disable",
        +  "legacy_item_add",
        +  "legacy_item_update",
        +  "subscription_create",
        +  "subscription_grant",
        +  "subscription_trial",
        +  "subscription_renew",
        +  "subscription_change_plan",
        +  "subscription_pause",
        +  "subscription_resume",
        +  "subscription_autorenew_disable",
        +  "payment_create",
        +  "payment_confirm"
        +]
      • changedInput schema / properties / action / oneOf
        Previous value: -[
        -  {
        -    "const": "plan_add",
        -    "description": "Creates a tariff plan. Optional: title, description, type, price, price_old, is_discount, is_advantage, interval, period, trial_interval, group_to, group_back, text_advantage, advantage_items, fields."
        -  },
        -  {
        -    "const": "plan_update",
        -    "description": "Updates a tariff plan. Required: plan_id. Optional: title, description, type, price, price_old, is_discount, is_advantage, interval, period, trial_interval, group_to, group_back, text_advantage, advantage_items, fields."
        -  },
        -  {
        -    "const": "plan_enable",
        -    "description": "Enables a tariff plan. Required: plan_id."
        -  },
        -  {
        -    "const": "plan_disable",
        -    "description": "Disables a tariff plan. Required: plan_id."
        -  },
        -  {
        -    "const": "legacy_item_add",
        -    "description": "Creates a legacy tariff. Optional: title, description, type, price, price_old, is_discount, is_advantage, interval, period, trial_interval, group_to, group_back, text_advantage, advantage_items, fields."
        -  },
        -  {
        -    "const": "legacy_item_update",
        -    "description": "Updates a legacy tariff (id in id or plan_id). Optional: id, plan_id, title, description, type, price, price_old, is_discount, is_advantage, interval, period, trial_interval, group_to, group_back, text_advantage, advantage_items, fields."
        -  },
        -  {
        -    "const": "subscription_create",
        -    "description": "Creates a subscription of a user to a plan. Required: user_id, plan_id. Optional: fields."
        -  },
        -  {
        -    "const": "subscription_grant",
        -    "description": "Grants a user access to a plan without payment. Required: user_id, plan_id, confirm. Optional: fields."
        -  },
        -  {
        -    "const": "subscription_trial",
        -    "description": "Starts a trial subscription of a user to a plan. Required: user_id, plan_id. Optional: fields."
        -  },
        -  {
        -    "const": "subscription_renew",
        -    "description": "Renews a subscription. Required: subscription_id."
        -  },
        -  {
        -    "const": "subscription_change_plan",
        -    "description": "Moves a subscription to another plan. Required: subscription_id, plan_id. Optional: fields."
        -  },
        -  {
        -    "const": "subscription_pause",
        -    "description": "Pauses a subscription. Required: subscription_id."
        -  },
        -  {
        -    "const": "subscription_resume",
        -    "description": "Resumes a paused subscription. Required: subscription_id."
        -  },
        -  {
        -    "const": "subscription_autorenew_enable",
        -    "description": "Turns on auto-renewal of a subscription. Required: subscription_id."
        -  },
        -  {
        -    "const": "subscription_autorenew_disable",
        -    "description": "Turns off auto-renewal of a subscription. Required: subscription_id."
        -  },
        -  {
        -    "const": "payment_create",
        -    "description": "Creates a payment for a subscription. Required: subscription_id. Optional: amount, payment_method_id, currency, transaction_id, fields."
        -  },
        -  {
        -    "const": "payment_confirm",
        -    "description": "Confirms a payment. Required: payment_id, confirm."
        -  },
        -  {
        -    "const": "payment_refund",
        -    "description": "Refunds a payment. Required: payment_id, confirm."
        -  }
        -]New value: +[
        +  {
        +    "const": "plan_add",
        +    "description": "Creates a tariff plan. Optional: title, description, type, price, price_old, is_discount, is_advantage, interval, period, trial_interval, group_to, group_back, text_advantage, advantage_items, fields."
        +  },
        +  {
        +    "const": "plan_update",
        +    "description": "Updates a tariff plan. Required: plan_id. Optional: title, description, type, price, price_old, is_discount, is_advantage, interval, period, trial_interval, group_to, group_back, text_advantage, advantage_items, fields."
        +  },
        +  {
        +    "const": "plan_enable",
        +    "description": "Enables a tariff plan. Required: plan_id."
        +  },
        +  {
        +    "const": "plan_disable",
        +    "description": "Disables a tariff plan. Required: plan_id."
        +  },
        +  {
        +    "const": "legacy_item_add",
        +    "description": "Creates a legacy tariff. Optional: title, description, type, price, price_old, is_discount, is_advantage, interval, period, trial_interval, group_to, group_back, text_advantage, advantage_items, fields."
        +  },
        +  {
        +    "const": "legacy_item_update",
        +    "description": "Updates a legacy tariff (id in id or plan_id). Optional: id, plan_id, title, description, type, price, price_old, is_discount, is_advantage, interval, period, trial_interval, group_to, group_back, text_advantage, advantage_items, fields."
        +  },
        +  {
        +    "const": "subscription_create",
        +    "description": "Creates an unpaid subscription of a user to a plan. Instead of a new one it reuses the unpaid subscription of the user to this plan (for a recurring plan also a paused or expired one, which keeps its status), refreshes it from the current plan and clears its saved payment method, so its auto-renewal is lost. Refused when the user has an active or trial subscription to any plan (unless the requested plan is a donation plan). Gives no access, charges nothing and records no payment. Required: user_id, plan_id. Optional: fields."
        +  },
        +  {
        +    "const": "subscription_grant",
        +    "description": "Grants a user paid access to a plan without any payment: a subscription is created, or an unpaid one of the user to this plan (for a recurring plan also a paused or expired one) is reused and refreshed from the plan, and it is activated at once for one plan period (unlimited when the plan has no period). The user is moved to the plan group, and the user and the site owner are notified. No payment is recorded. Refused when the user has an active or trial subscription to any plan (unless the requested plan is a donation plan). Required: user_id, plan_id, confirm. Optional: fields."
        +  },
        +  {
        +    "const": "subscription_trial",
        +    "description": "Starts a free trial of a recurring plan that has trial days: the subscription gets the trial status for trial_interval days without a card or any payment. The user group is not changed. Refused when the user already has this plan active, in trial or paused, or has an active or trial subscription to any other plan. Required: user_id, plan_id. Optional: fields."
        +  },
        +  {
        +    "const": "subscription_renew",
        +    "description": "Extends a subscription by one plan period without payment and without a payment record: from its end date, or from now when it has ended. The subscription becomes active and the user is moved to the plan group, even if it was unpaid, in trial or paused. A cancelled one is refused. When the subscription has a saved payment method, automatic charges are scheduled again, even if auto-renewal was turned off. Required: subscription_id."
        +  },
        +  {
        +    "const": "subscription_change_plan",
        +    "description": "Moves a subscription to another plan at once: the new price, period and group (for an active or trial subscription) apply now, without extra payment, refund or price recalculation, and the end date stays. Auto-renewal is kept when the new plan is recurring at the same price, and later charges then follow the new plan period; otherwise it is turned off and the saved payment method is removed. PayPal subscriptions are refused. Required: subscription_id, plan_id. Optional: fields."
        +  },
        +  {
        +    "const": "subscription_pause",
        +    "description": "Pauses a subscription. Required: subscription_id."
        +  },
        +  {
        +    "const": "subscription_resume",
        +    "description": "Resumes a paused subscription that has not ended: the user is moved back to the plan group, and automatic charges of a saved payment method are scheduled again, even if auto-renewal was turned off before the pause; the next charge may come within the hour when the period ends soon. Required: subscription_id."
        +  },
        +  {
        +    "const": "subscription_autorenew_disable",
        +    "description": "Turns off auto-renewal of a subscription. Required: subscription_id."
        +  },
        +  {
        +    "const": "payment_create",
        +    "description": "Records an unpaid payment of a subscription in the module accounts only: nothing is charged, no payment system is contacted, and the subscription does not change. amount is in minor currency units; the payment method must be enabled on the site. Required: subscription_id, amount. Optional: payment_method_id, currency, transaction_id, fields."
        +  },
        +  {
        +    "const": "payment_confirm",
        +    "description": "Marks an unpaid or awaiting payment as paid without any check that money was received; nothing is charged. The subscription is activated and extended by one plan period, the user is moved to the plan group, and the payment counts in paid totals (plan_stats). The amount is not checked against the plan price. When the subscription has a saved payment method, automatic charges are scheduled again, even if auto-renewal was turned off; the next charge may come within the hour when the plan period is short. Required: payment_id, confirm."
        +  }
        +]
      • changedInput schema / properties / confirm / description
        Previous value: -"Pass true only after the user approves this change. Required by: subscription_grant, payment_confirm, payment_refund."New value: +"Pass true only after the user approves this change. Required by: subscription_grant, payment_confirm."
  6. 1 tool update
    • Changedusers_write1 field changed
      • changedInput schema / properties / action / oneOf
        Previous value: -[
        -  {
        -    "const": "add",
        -    "description": "Creates a user (login in nick or user). The full name goes in name (or fields.full_name). Required: password, email, name. Optional: nick, user, fields."
        -  },
        -  {
        -    "const": "register",
        -    "description": "Creates a user (same as add). Required: password, email, name. Optional: nick, user, fields."
        -  },
        -  {
        -    "const": "update",
        -    "description": "Updates a user profile. Required: user_id. Optional: name, email, fields."
        -  },
        -  {
        -    "const": "chlogin",
        -    "description": "Changes the login of a user. Required: user_id, login."
        -  },
        -  {
        -    "const": "chgroup",
        -    "description": "Moves a user to another group. Required: user_id, gid."
        -  },
        -  {
        -    "const": "chpass",
        -    "description": "Sets a new password for a user. Required: user_id, password, confirm."
        -  },
        -  {
        -    "const": "group_add",
        -    "description": "Creates a user group. Required: name. Optional: fields."
        -  },
        -  {
        -    "const": "group_update",
        -    "description": "Updates a user group (group id in id or gid). Optional: id, gid, name, fields."
        -  }
        -]New value: +[
        +  {
        +    "const": "add",
        +    "description": "Creates a user (login in nick or user). The full name goes in name (or fields.full_name). Required: password, email, name. Optional: nick, user, fields."
        +  },
        +  {
        +    "const": "register",
        +    "description": "Creates a user (same as add). Required: password, email, name. Optional: nick, user, fields."
        +  },
        +  {
        +    "const": "update",
        +    "description": "Updates a user profile: values that are not passed keep their stored values, an empty string clears a value. The full name goes in name (or fields.full_name). Required: user_id. Optional: name, email, fields."
        +  },
        +  {
        +    "const": "chlogin",
        +    "description": "Changes the login of a user. Required: user_id, login."
        +  },
        +  {
        +    "const": "chgroup",
        +    "description": "Moves a user to another group. Required: user_id, gid."
        +  },
        +  {
        +    "const": "chpass",
        +    "description": "Sets a new password for a user. Required: user_id, password, confirm."
        +  },
        +  {
        +    "const": "group_add",
        +    "description": "Creates a user group. Required: name. Optional: fields."
        +  },
        +  {
        +    "const": "group_update",
        +    "description": "Updates a user group (group id in id or gid). Optional: id, gid, name, fields."
        +  }
        +]
  7. 3 tool updates
    • Changedcontent_write4 fields changed
      • changedInput schema / properties / description / description
        Previous value: -"Short description / FAQ question. Use description_type=html when formatted."New value: +"Short description / FAQ question; its format is set by description_type."
      • changedInput schema / properties / description_type / description
        Previous value: -"Description format."New value: +"Format of description (faq: question); the same as message_type."
      • changedInput schema / properties / message / description
        Previous value: -"Full text (entry, comment, post). Use message_type=html when formatted."New value: +"Full text (entry, comment, post); the format of an entry text is set by message_type."
      • changedInput schema / properties / message_type / description
        Previous value: -"Message format."New value: +"Format of message (faq: answer) on add and update: plain escapes the markup, bb turns BB codes into HTML, html keeps the HTML. news and load always keep the HTML; blog, publ, board, dir, stuff and faq keep it only when the user group may use HTML in the module, otherwise the markup is escaped. Without it a non-empty text of these modules is saved as html."
    • Changedforum_write2 fields changed
      • changedInput schema / properties / description / description
        Previous value: -"Short description / FAQ question. Use description_type=html when formatted."New value: +"Short description / FAQ question; its format is set by description_type."
      • changedInput schema / properties / message / description
        Previous value: -"Full text (entry, comment, post). Use message_type=html when formatted."New value: +"Full text (entry, comment, post); the format of an entry text is set by message_type."
    • Changedtemplates_write1 field changed
      • changedInput schema / properties / page_message / description
        Previous value: -"Page HTML content."New value: +"Page HTML content. It is saved as HTML whatever editor the site uses."
  8. 11 tool updates
    • Changedapps_read6 fields changed
      • changedInput schema / properties / action / oneOf
        Previous value: -[
        -  {
        -    "const": "get_guide",
        -    "description": "Returns a step-by-step guide to the server environment."
        -  },
        -  {
        -    "const": "info",
        -    "description": "Returns information about the environment server."
        -  },
        -  {
        -    "const": "status",
        -    "description": "Returns whether server scripts are available on the plan and activated, and the account username and technical domain."
        -  },
        -  {
        -    "const": "session",
        -    "description": "Returns the current environment session, including selected_domain."
        -  },
        -  {
        -    "const": "session_state",
        -    "description": "Returns the environment session state."
        -  },
        -  {
        -    "const": "usage",
        -    "description": "Returns disk and resource usage of the environment."
        -  },
        -  {
        -    "const": "user_config",
        -    "description": "Returns the environment user configuration."
        -  },
        -  {
        -    "const": "plugins",
        -    "description": "Lists environment plugins."
        -  },
        -  {
        -    "const": "php_get",
        -    "description": "Returns the PHP version and settings."
        -  },
        -  {
        -    "const": "selector_get",
        -    "description": "Reads a language selector (method get) of plugin phpselector, nodejs_selector or python_selector. Required: plugin, interpreter. Optional: params."
        -  },
        -  {
        -    "const": "node_list",
        -    "description": "Lists Node.js applications."
        -  },
        -  {
        -    "const": "python_list",
        -    "description": "Lists Python applications."
        -  },
        -  {
        -    "const": "files_list",
        -    "description": "Lists a directory (default: home). Optional: path, limit, offset."
        -  },
        -  {
        -    "const": "files_tree",
        -    "description": "Returns the directory tree under path. Optional: path, limit, offset."
        -  },
        -  {
        -    "const": "files_read",
        -    "description": "Reads a small text file. A binary or larger file is refused; files_publish in apps_write returns a download link for it. Required: path."
        -  },
        -  {
        -    "const": "files_search",
        -    "description": "Searches file names under path. Required: query. Optional: path, limit, offset."
        -  },
        -  {
        -    "const": "files_disk",
        -    "description": "Returns disk usage of the home directory."
        -  },
        -  {
        -    "const": "files_archive_list",
        -    "description": "Lists the members of an archive. Required: path."
        -  },
        -  {
        -    "const": "db_list",
        -    "description": "Lists MySQL databases."
        -  },
        -  {
        -    "const": "db_get",
        -    "description": "Returns one MySQL database (name in database or name). Optional: database, name."
        -  },
        -  {
        -    "const": "db_info",
        -    "description": "Returns MySQL server information."
        -  },
        -  {
        -    "const": "db_user",
        -    "description": "Returns one MySQL user (name in dbuser or name). Optional: dbuser, name."
        -  },
        -  {
        -    "const": "db_users",
        -    "description": "Lists the users of a MySQL database (name in database or name). Optional: database, name."
        -  },
        -  {
        -    "const": "db_users_all",
        -    "description": "Lists all MySQL users."
        -  },
        -  {
        -    "const": "db_user_databases",
        -    "description": "Lists the databases of a MySQL user (name in dbuser or name). Optional: dbuser, name."
        -  },
        -  {
        -    "const": "ftp_list",
        -    "description": "Lists environment FTP accounts of a domain. Optional: domain."
        -  },
        -  {
        -    "const": "cron_list",
        -    "description": "Lists cron jobs (each with its cron_id) and cron settings."
        -  },
        -  {
        -    "const": "backup_list",
        -    "description": "Lists environment backups. Optional: domain."
        -  },
        -  {
        -    "const": "login_key_list",
        -    "description": "Lists environment login key records without their values."
        -  },
        -  {
        -    "const": "da_login_key_list",
        -    "description": "Lists panel login keys of the environment without secret values."
        -  },
        -  {
        -    "const": "da_login_key_get",
        -    "description": "Returns the settings of one panel login key without secret values. Required: key_id. Optional: id."
        -  },
        -  {
        -    "const": "da_login_key_history",
        -    "description": "Returns the usage history of a panel login key. Required: key_id. Optional: id."
        -  },
        -  {
        -    "const": "da_login_key_commands",
        -    "description": "Lists the commands a panel login key can be allowed or denied."
        -  }
        -]New value: +[
        +  {
        +    "const": "get_guide",
        +    "description": "Returns a step-by-step guide to the server environment."
        +  },
        +  {
        +    "const": "info",
        +    "description": "Returns information about the environment server."
        +  },
        +  {
        +    "const": "status",
        +    "description": "Returns whether server scripts are available on the plan and activated, and the account username and technical domain."
        +  },
        +  {
        +    "const": "session",
        +    "description": "Returns the current environment session, including selected_domain."
        +  },
        +  {
        +    "const": "session_state",
        +    "description": "Returns the environment session state."
        +  },
        +  {
        +    "const": "usage",
        +    "description": "Returns disk and resource usage of the environment."
        +  },
        +  {
        +    "const": "user_config",
        +    "description": "Returns the environment user configuration."
        +  },
        +  {
        +    "const": "plugins",
        +    "description": "Lists environment plugins. Optional: offset."
        +  },
        +  {
        +    "const": "php_get",
        +    "description": "Returns the PHP version and settings."
        +  },
        +  {
        +    "const": "selector_get",
        +    "description": "Reads a language selector (method get) of plugin phpselector, nodejs_selector or python_selector. Required: plugin, interpreter. Optional: params."
        +  },
        +  {
        +    "const": "node_list",
        +    "description": "Lists Node.js applications. Optional: offset."
        +  },
        +  {
        +    "const": "python_list",
        +    "description": "Lists Python applications. Optional: offset."
        +  },
        +  {
        +    "const": "files_list",
        +    "description": "Lists a directory (default: home) a page at a time. Brief entries by default; detail=full gives complete entries. The reply has page, per_page, total, has_more, truncated and next. Optional: path, page, per_page, offset, detail, limit."
        +  },
        +  {
        +    "const": "files_tree",
        +    "description": "Returns the directory tree under path. A tree over 30 KB loses its deepest levels (truncated, branches marked incomplete); a folder with more subfolders than fit keeps the first of them, and next names the files_list call that lists it in full. Optional: path, limit, offset."
        +  },
        +  {
        +    "const": "files_read",
        +    "description": "Reads a small text file. A binary or larger file is refused; files_publish in apps_write returns a download link for it. Required: path."
        +  },
        +  {
        +    "const": "files_search",
        +    "description": "Searches file names under path, a page at a time; the search finds up to 1000 files. Brief entries by default; detail=full gives complete entries. The reply has page, per_page, total, has_more, truncated and next, and incomplete is true when more files may match than the search found. Required: query. Optional: path, page, per_page, offset, detail, limit."
        +  },
        +  {
        +    "const": "files_disk",
        +    "description": "Returns disk usage of the home directory."
        +  },
        +  {
        +    "const": "files_archive_list",
        +    "description": "Lists the members of an archive a page at a time. The reply has page, per_page, total, has_more, truncated and next. Required: path. Optional: page, per_page, offset, detail."
        +  },
        +  {
        +    "const": "db_list",
        +    "description": "Lists MySQL databases. Optional: offset."
        +  },
        +  {
        +    "const": "db_get",
        +    "description": "Returns one MySQL database (name in database or name). Optional: database, name."
        +  },
        +  {
        +    "const": "db_info",
        +    "description": "Returns MySQL server information."
        +  },
        +  {
        +    "const": "db_user",
        +    "description": "Returns one MySQL user (name in dbuser or name). Optional: dbuser, name."
        +  },
        +  {
        +    "const": "db_users",
        +    "description": "Lists the users of a MySQL database (name in database or name). Optional: database, name, offset."
        +  },
        +  {
        +    "const": "db_users_all",
        +    "description": "Lists all MySQL users. Optional: offset."
        +  },
        +  {
        +    "const": "db_user_databases",
        +    "description": "Lists the databases of a MySQL user (name in dbuser or name). Optional: dbuser, name, offset."
        +  },
        +  {
        +    "const": "ftp_list",
        +    "description": "Lists environment FTP accounts of a domain. Optional: domain, offset."
        +  },
        +  {
        +    "const": "cron_list",
        +    "description": "Lists cron jobs (each with its cron_id) and cron settings. Optional: offset."
        +  },
        +  {
        +    "const": "backup_list",
        +    "description": "Lists environment backups. Optional: domain, offset."
        +  },
        +  {
        +    "const": "login_key_list",
        +    "description": "Lists environment login key records without their values. Optional: offset."
        +  },
        +  {
        +    "const": "da_login_key_list",
        +    "description": "Lists panel login keys of the environment without secret values. Optional: offset."
        +  },
        +  {
        +    "const": "da_login_key_get",
        +    "description": "Returns the settings of one panel login key without secret values. Required: key_id. Optional: id."
        +  },
        +  {
        +    "const": "da_login_key_history",
        +    "description": "Returns the usage history of a panel login key a page at a time. The reply has page, per_page, total, has_more, truncated and next. Required: key_id. Optional: id, page, per_page, offset, detail."
        +  },
        +  {
        +    "const": "da_login_key_commands",
        +    "description": "Lists the commands a panel login key can be allowed or denied. Optional: offset."
        +  }
        +]
      • addedInput schema / properties / detail
        Added value: +{
        +  "description": "Record form of a paged list. brief (default): for files name, folder, type, size, modification time (UTC, ISO 8601) and symlink flag; for other lists the records as they are. Titles and excerpts are plain text; names, logins, paths, URLs and other identifiers are as the source gives them. full: complete records. A list reply is at most 30 KB and holds every record of its page: a record that does not fit in full comes in brief form, marked detail brief, the reply counts such records in brief_records, and get by id returns the complete record; brief records shorten their excerpts, then keep only their ids and titles. Only a page that does not fit even so is cut: truncated is true and next names the offset to go on from.",
        +  "enum": [
        +    "brief",
        +    "full"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / limit / description
        Previous value: -"Listing limit."New value: +"files_*: the earlier name of per_page; per_page wins when both are set. files_tree: entries of the tree."
      • changedInput schema / properties / offset / description
        Previous value: -"Listing offset."New value: +"Records to skip from the start of a list; overrides page. A list reply cut at its size limit names the offset that follows in next."
      • addedInput schema / properties / page
        Added value: +{
        +  "description": "List page, from 1.",
        +  "type": "number"
        +}
      • addedInput schema / properties / per_page
        Added value: +{
        +  "description": "Records per page: 1-50, 20 by default, larger values count as 50.",
        +  "type": "number"
        +}
    • Changedcontent_read5 fields changed
      • changedInput schema / properties / action / oneOf
        Previous value: -[
        -  {
        -    "const": "list",
        -    "description": "Lists entries of a module (photo: albums), with paging and filters. Required: module. Optional: id, page, per_page, category, date, pending, user_id, sort."
        -  },
        -  {
        -    "const": "get",
        -    "description": "Returns one entry. Required: module, id."
        -  },
        -  {
        -    "const": "fields",
        -    "description": "Lists the entry fields of a module, including custom fields other1-other5. Required: module."
        -  },
        -  {
        -    "const": "category_list",
        -    "description": "Lists the categories of a module, or returns one category by id. Required: module. Optional: id."
        -  },
        -  {
        -    "const": "comments_list",
        -    "description": "Lists the comments of an entry. Required: module, id."
        -  },
        -  {
        -    "const": "comments_all",
        -    "description": "Lists the latest comments of all modules. No module is needed. Optional: page, per_page, tree, sort."
        -  },
        -  {
        -    "const": "filter_list",
        -    "description": "Lists the entry filters of a module. Required: module. Optional: filter_num, id."
        -  },
        -  {
        -    "const": "album_list",
        -    "description": "Lists photo albums (module photo). Required: module. Optional: category, page."
        -  },
        -  {
        -    "const": "channel_list",
        -    "description": "Lists video channels, or returns one by channel_id or id (module video). Required: module. Optional: channel_id, id."
        -  },
        -  {
        -    "const": "channel_category_list",
        -    "description": "Lists video channel categories (module video). Required: module. Optional: id."
        -  },
        -  {
        -    "const": "smiles",
        -    "description": "Lists chat smiles (module mchat). Required: module."
        -  }
        -]New value: +[
        +  {
        +    "const": "list",
        +    "description": "Lists entries of a module (photo: photos of the albums) a page at a time, with filters. By default entries are brief, without full texts; complete entries come with detail=full, and one complete entry from get by id. The reply has page, per_page, total, has_more, truncated and, while entries remain, next with the paging arguments of the following page. Required: module. Optional: id, page, per_page, offset, detail, category, date, pending, user_id, sort."
        +  },
        +  {
        +    "const": "get",
        +    "description": "Returns one entry. Required: module, id."
        +  },
        +  {
        +    "const": "fields",
        +    "description": "Lists the entry fields of a module, including custom fields other1-other5. Required: module. Optional: offset."
        +  },
        +  {
        +    "const": "category_list",
        +    "description": "Lists the categories of a module, or returns one category by id. Required: module. Optional: id, offset."
        +  },
        +  {
        +    "const": "comments_list",
        +    "description": "Lists the comments of an entry a page at a time, paged like list. Brief comments by default; detail=full gives complete comments with their replies. Required: module, id. Optional: page, per_page, offset, detail."
        +  },
        +  {
        +    "const": "comments_all",
        +    "description": "Lists the latest comments of all modules a page at a time, paged like list. No module is needed. Brief comments by default; detail=full gives complete comments. Optional: page, per_page, offset, detail, tree, sort."
        +  },
        +  {
        +    "const": "filter_list",
        +    "description": "Lists the entry filters of a module. Required: module. Optional: filter_num, id, offset."
        +  },
        +  {
        +    "const": "album_list",
        +    "description": "Lists the photos of photo albums (module photo), of one album when category is set; paged like list. Required: module. Optional: category, page, per_page, offset, detail."
        +  },
        +  {
        +    "const": "channel_list",
        +    "description": "Lists video channels, or returns one by channel_id or id (module video). Required: module. Optional: channel_id, id, offset."
        +  },
        +  {
        +    "const": "channel_category_list",
        +    "description": "Lists video channel categories (module video). Required: module. Optional: id, offset."
        +  },
        +  {
        +    "const": "smiles",
        +    "description": "Lists chat smiles (module mchat). Required: module. Optional: offset."
        +  }
        +]
      • addedInput schema / properties / detail
        Added value: +{
        +  "description": "Record form of a paged list. brief (default): the fields that identify a record, without full texts and HTML; for entries id, title up to 120 characters, status, date added (UTC, ISO 8601), public URL, category id and an excerpt up to 200 characters. Titles and excerpts are plain text; names, logins, paths, URLs and other identifiers are as the source gives them. full: complete records. A list reply is at most 30 KB and holds every record of its page: a record that does not fit in full comes in brief form, marked detail brief, the reply counts such records in brief_records, and get by id returns the complete record; brief records shorten their excerpts, then keep only their ids and titles. Only a page that does not fit even so is cut: truncated is true and next names the offset to go on from.",
        +  "enum": [
        +    "brief",
        +    "full"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "description": "Records to skip from the start of a list; overrides page. A list reply cut at its size limit names the offset that follows in next.",
        +  "type": "number"
        +}
      • changedInput schema / properties / page / description
        Previous value: -"List page."New value: +"List page, from 1."
      • changedInput schema / properties / per_page / description
        Previous value: -"List page size (max 100)."New value: +"Records per page: 1-50, 20 by default, larger values count as 50."
    • Changedfiles_read6 fields changed
      • changedInput schema / properties / action / oneOf
        Previous value: -[
        -  {
        -    "const": "list",
        -    "description": "Lists a folder of the site file manager (default: site root, sorted by name, no filter). Optional: path, filter, sort, order, offset, limit."
        -  },
        -  {
        -    "const": "info",
        -    "description": "Returns information about a file or folder. Optional: path."
        -  },
        -  {
        -    "const": "quota",
        -    "description": "Returns the disk quota and the upload limits (size, allowed filters)."
        -  },
        -  {
        -    "const": "content_get",
        -    "description": "Reads a text file. Other files come back as FM_NOT_TEXT or FM_TOO_LARGE_TO_READ. Required: path."
        -  }
        -]New value: +[
        +  {
        +    "const": "list",
        +    "description": "Lists a folder of the site file manager (default: site root, sorted by name, no filter) a page at a time. Brief entries by default; detail=full gives complete entries. The reply has page, per_page, total, has_more, truncated and next. Optional: path, filter, sort, order, page, per_page, offset, detail, limit."
        +  },
        +  {
        +    "const": "info",
        +    "description": "Returns information about a file or folder. Optional: path."
        +  },
        +  {
        +    "const": "quota",
        +    "description": "Returns the disk quota and the upload limits (size, allowed filters)."
        +  },
        +  {
        +    "const": "content_get",
        +    "description": "Reads a text file. Other files come back as FM_NOT_TEXT or FM_TOO_LARGE_TO_READ. Required: path."
        +  }
        +]
      • addedInput schema / properties / detail
        Added value: +{
        +  "description": "Record form of a paged list. brief (default): name, path, type, size, objects in a folder and modification time (UTC, ISO 8601). Titles and excerpts are plain text; names, logins, paths, URLs and other identifiers are as the source gives them. full: complete records. A list reply is at most 30 KB and holds every record of its page: a record that does not fit in full comes in brief form, marked detail brief, the reply counts such records in brief_records, and get by id returns the complete record; brief records shorten their excerpts, then keep only their ids and titles. Only a page that does not fit even so is cut: truncated is true and next names the offset to go on from.",
        +  "enum": [
        +    "brief",
        +    "full"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / limit / description
        Previous value: -"list: slice length. 0 (default) means the rest of the listing."New value: +"list: the earlier name of per_page; per_page wins when both are set, and 0 counts as not set."
      • changedInput schema / properties / offset / description
        Previous value: -"list: slice start after sorting. Default 0."New value: +"Records to skip from the start of a list; overrides page. A list reply cut at its size limit names the offset that follows in next."
      • addedInput schema / properties / page
        Added value: +{
        +  "description": "List page, from 1.",
        +  "type": "number"
        +}
      • addedInput schema / properties / per_page
        Added value: +{
        +  "description": "Records per page: 1-50, 20 by default, larger values count as 50.",
        +  "type": "number"
        +}
    • Changedforum_read5 fields changed
      • changedInput schema / properties / action / oneOf
        Previous value: -[
        -  {
        -    "const": "forum_list",
        -    "description": "Lists forums, or the forums under id (or forum_id). Optional: id, forum_id."
        -  },
        -  {
        -    "const": "forum_get",
        -    "description": "Returns one forum (id in forum_id or id). Optional: forum_id, id."
        -  },
        -  {
        -    "const": "section_list",
        -    "description": "Lists forum sections, or returns one (id in section_id or id). Optional: section_id, id."
        -  },
        -  {
        -    "const": "topic_list",
        -    "description": "Lists the topics of a forum. Optional: forum_id, topic_id, page, per_page."
        -  },
        -  {
        -    "const": "topic_get",
        -    "description": "Returns one topic (id in topic_id or id). Optional: topic_id, id, forum_id."
        -  },
        -  {
        -    "const": "post_list",
        -    "description": "Lists the posts of a topic. Optional: topic_id, post_id, page, per_page."
        -  },
        -  {
        -    "const": "post_get",
        -    "description": "Returns one post (id in post_id or id). Optional: post_id, id, topic_id."
        -  },
        -  {
        -    "const": "poll_list",
        -    "description": "Lists forum polls. Optional: forum_id, poll_id, page, per_page."
        -  },
        -  {
        -    "const": "poll_get",
        -    "description": "Returns one forum poll (id in poll_id or id). Optional: poll_id, id, forum_id."
        -  },
        -  {
        -    "const": "poll_results",
        -    "description": "Returns the results of a forum poll (id in poll_id or id). Optional: poll_id, id."
        -  }
        -]New value: +[
        +  {
        +    "const": "forum_list",
        +    "description": "Lists forums, or the forums under id (or forum_id). Optional: id, forum_id, offset."
        +  },
        +  {
        +    "const": "forum_get",
        +    "description": "Returns one forum (id in forum_id or id). Optional: forum_id, id."
        +  },
        +  {
        +    "const": "section_list",
        +    "description": "Lists forum sections, or returns one (id in section_id or id). Optional: section_id, id, offset."
        +  },
        +  {
        +    "const": "topic_list",
        +    "description": "Lists the topics of a forum a page at a time. Brief topics by default; detail=full gives complete topics. The reply has page, per_page, total, has_more, truncated and next. Optional: forum_id, topic_id, page, per_page, offset, detail."
        +  },
        +  {
        +    "const": "topic_get",
        +    "description": "Returns one topic (id in topic_id or id). Optional: topic_id, id, forum_id."
        +  },
        +  {
        +    "const": "post_list",
        +    "description": "Lists the posts of a topic a page at a time. Brief posts by default, without full texts; detail=full gives complete posts, post_get one complete post. The reply has page, per_page, total, has_more, truncated and next. Optional: topic_id, post_id, page, per_page, offset, detail."
        +  },
        +  {
        +    "const": "post_get",
        +    "description": "Returns one post (id in post_id or id). Optional: post_id, id, topic_id."
        +  },
        +  {
        +    "const": "poll_list",
        +    "description": "Lists forum polls a page at a time. Brief polls by default; detail=full gives complete polls. The reply has page, per_page, total, has_more, truncated and next. Optional: forum_id, poll_id, page, per_page, offset, detail."
        +  },
        +  {
        +    "const": "poll_get",
        +    "description": "Returns one forum poll (id in poll_id or id). Optional: poll_id, id, forum_id."
        +  },
        +  {
        +    "const": "poll_results",
        +    "description": "Returns the results of a forum poll (id in poll_id or id). Optional: poll_id, id."
        +  }
        +]
      • addedInput schema / properties / detail
        Added value: +{
        +  "description": "Record form of a paged list. brief (default): the fields that identify a record, without full texts and HTML; for entries id, title up to 120 characters, status, date added (UTC, ISO 8601), public URL, category id and an excerpt up to 200 characters. Titles and excerpts are plain text; names, logins, paths, URLs and other identifiers are as the source gives them. full: complete records. A list reply is at most 30 KB and holds every record of its page: a record that does not fit in full comes in brief form, marked detail brief, the reply counts such records in brief_records, and get by id returns the complete record; brief records shorten their excerpts, then keep only their ids and titles. Only a page that does not fit even so is cut: truncated is true and next names the offset to go on from.",
        +  "enum": [
        +    "brief",
        +    "full"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "description": "Records to skip from the start of a list; overrides page. A list reply cut at its size limit names the offset that follows in next.",
        +  "type": "number"
        +}
      • changedInput schema / properties / page / description
        Previous value: -"List page."New value: +"List page, from 1."
      • changedInput schema / properties / per_page / description
        Previous value: -"List page size (max 100)."New value: +"Records per page: 1-50, 20 by default, larger values count as 50."
    • Changedmodules_read2 fields changed
      • changedInput schema / properties / action / oneOf
        Previous value: -[
        -  {
        -    "const": "active_mods",
        -    "description": "Lists the modules installed on the site."
        -  },
        -  {
        -    "const": "modules_list",
        -    "description": "Lists all modules with their installed and uAPI flags (needs Control Panel access)."
        -  },
        -  {
        -    "const": "module_status",
        -    "description": "Returns the status of one module (needs Control Panel access). Required: module_code."
        -  },
        -  {
        -    "const": "quarantine_status",
        -    "description": "Returns the indexing quarantine status of the site."
        -  }
        -]New value: +[
        +  {
        +    "const": "active_mods",
        +    "description": "Lists the modules installed on the site. Optional: offset."
        +  },
        +  {
        +    "const": "modules_list",
        +    "description": "Lists all modules with their installed and uAPI flags (needs Control Panel access). Optional: offset."
        +  },
        +  {
        +    "const": "module_status",
        +    "description": "Returns the status of one module (needs Control Panel access). Required: module_code."
        +  },
        +  {
        +    "const": "quarantine_status",
        +    "description": "Returns the indexing quarantine status of the site."
        +  }
        +]
      • addedInput schema / properties / offset
        Added value: +{
        +  "description": "Records to skip from the start of a list; overrides page. A list reply cut at its size limit names the offset that follows in next.",
        +  "type": "number"
        +}
    • Changedsettings_read2 fields changed
      • changedInput schema / properties / action / oneOf
        Previous value: -[
        -  {
        -    "const": "settings_modules",
        -    "description": "Lists the modules whose settings can be read and changed, and whether each one is active on the site (null when not tracked)."
        -  },
        -  {
        -    "const": "settings_get",
        -    "description": "Returns the current settings of a module (nested). Access keys are shown only as (set) or empty. Required: module."
        -  }
        -]New value: +[
        +  {
        +    "const": "settings_modules",
        +    "description": "Lists the modules whose settings can be read and changed, and whether each one is active on the site (null when not tracked). Optional: offset."
        +  },
        +  {
        +    "const": "settings_get",
        +    "description": "Returns the current settings of a module (nested). Access keys are shown only as (set) or empty. Required: module."
        +  }
        +]
      • addedInput schema / properties / offset
        Added value: +{
        +  "description": "Records to skip from the start of a list; overrides page. A list reply cut at its size limit names the offset that follows in next.",
        +  "type": "number"
        +}
    • Changedshop_read6 fields changed
      • changedInput schema / properties / action / oneOf
        Previous value: -[
        -  {
        -    "const": "category_list",
        -    "description": "Lists shop categories (children of parent_id when set). Optional: parent_id, pid, get_globals."
        -  },
        -  {
        -    "const": "list",
        -    "description": "Lists products with paging, sorting and filters: all goods, the wishlist of the current user, or the goods of user_id (view usergoods). Optional: view, user_id, pnum, page, sort, order, f_name, f_brand, f_art, f_price, f_stock, f_status, f_warr, f_weight."
        -  },
        -  {
        -    "const": "get",
        -    "description": "Returns one product card. Required: id. Optional: cnt, goods_id."
        -  },
        -  {
        -    "const": "variations_list",
        -    "description": "Lists the variations of a product. Required: id."
        -  },
        -  {
        -    "const": "variation_get",
        -    "description": "Returns one variation of a product. Required: id, variation_crc."
        -  },
        -  {
        -    "const": "variation_dict_list",
        -    "description": "Returns one variation dictionary (name and values) by its id. Required: id."
        -  },
        -  {
        -    "const": "stock_get",
        -    "description": "Returns the stock of a product by option sets. Required: id."
        -  },
        -  {
        -    "const": "basket_get",
        -    "description": "Returns the basket of the current user, or of user_id. Optional: user_id."
        -  },
        -  {
        -    "const": "checkout_get",
        -    "description": "Returns the checkout form data for the current basket. Optional: promo_code, custom_delivery_tax."
        -  },
        -  {
        -    "const": "invoices_list",
        -    "description": "Lists orders with filters. Optional: page, user_id, hide, status, group_courier, payment_id, delivery_id, ids, id, inv_sum, cdate, date."
        -  },
        -  {
        -    "const": "order_get",
        -    "description": "Returns one order (order hash in order or id). Optional: order, id."
        -  },
        -  {
        -    "const": "comments_list",
        -    "description": "Lists the comments of a product. Required: id."
        -  },
        -  {
        -    "const": "currencies",
        -    "description": "Lists shop currencies and rates."
        -  },
        -  {
        -    "const": "balance_get",
        -    "description": "Returns the balance of a user. Optional: user_id."
        -  }
        -]New value: +[
        +  {
        +    "const": "category_list",
        +    "description": "Lists shop categories (children of parent_id when set). Optional: parent_id, pid, get_globals, offset."
        +  },
        +  {
        +    "const": "list",
        +    "description": "Lists products a page at a time, with sorting and filters: all goods, the wishlist of the current user, or the goods of user_id (view usergoods). By default products are brief, without descriptions; complete products come with detail=full, and one complete product card from get by id. The reply has page, per_page, total, has_more, truncated and, while products remain, next with the paging arguments of the following page. A shop that shows fewer than 5 products a catalog page serves fewer products a list page than per_page asks; the reply per_page names how many, and pages by number stay consecutive. Optional: view, user_id, page, pnum, per_page, offset, detail, sort, order, f_name, f_brand, f_art, f_price, f_stock, f_status, f_warr, f_weight."
        +  },
        +  {
        +    "const": "get",
        +    "description": "Returns one product card. Required: id. Optional: cnt, goods_id."
        +  },
        +  {
        +    "const": "variations_list",
        +    "description": "Lists the variations of a product. Required: id. Optional: offset."
        +  },
        +  {
        +    "const": "variation_get",
        +    "description": "Returns one variation of a product. Required: id, variation_crc."
        +  },
        +  {
        +    "const": "variation_dict_list",
        +    "description": "Returns one variation dictionary (name and values) by its id. Required: id."
        +  },
        +  {
        +    "const": "stock_get",
        +    "description": "Returns the stock of a product by option sets. Required: id. Optional: offset."
        +  },
        +  {
        +    "const": "basket_get",
        +    "description": "Returns the basket of the current user, or of user_id. Optional: user_id."
        +  },
        +  {
        +    "const": "checkout_get",
        +    "description": "Returns the checkout form data for the current basket. Optional: promo_code, custom_delivery_tax."
        +  },
        +  {
        +    "const": "invoices_list",
        +    "description": "Lists orders with filters, a page at a time, paged like list. Brief orders by default; detail=full gives complete orders, order_get one complete order. Optional: page, per_page, offset, detail, user_id, hide, status, group_courier, payment_id, delivery_id, ids, id, inv_sum, cdate, date."
        +  },
        +  {
        +    "const": "order_get",
        +    "description": "Returns one order (order hash in order or id). Optional: order, id."
        +  },
        +  {
        +    "const": "comments_list",
        +    "description": "Lists the comments of a product a page at a time, paged like list. Brief comments by default; detail=full gives complete comments. Required: id. Optional: page, per_page, offset, detail."
        +  },
        +  {
        +    "const": "currencies",
        +    "description": "Lists shop currencies and rates. Optional: offset."
        +  },
        +  {
        +    "const": "balance_get",
        +    "description": "Returns the balance of a user. Optional: user_id."
        +  }
        +]
      • addedInput schema / properties / detail
        Added value: +{
        +  "description": "Record form of a paged list. brief (default): the fields that identify a record, without descriptions and HTML; for products id, title up to 120 characters, status (visible or hidden), date added (UTC, ISO 8601), public URL, price, stock, category id and an excerpt up to 200 characters. Titles and excerpts are plain text; names, logins, paths, URLs and other identifiers are as the source gives them. full: complete records. A list reply is at most 30 KB and holds every record of its page: a record that does not fit in full comes in brief form, marked detail brief, the reply counts such records in brief_records, and get by id returns the complete record; brief records shorten their excerpts, then keep only their ids and titles. Only a page that does not fit even so is cut: truncated is true and next names the offset to go on from.",
        +  "enum": [
        +    "brief",
        +    "full"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "description": "Records to skip from the start of a list; overrides page. A list reply cut at its size limit names the offset that follows in next.",
        +  "type": "number"
        +}
      • changedInput schema / properties / page / description
        Previous value: -"List page (orders / goods)."New value: +"List page, from 1."
      • addedInput schema / properties / per_page
        Added value: +{
        +  "description": "Records per page: 1-50, 20 by default, larger values count as 50.",
        +  "type": "number"
        +}
      • changedInput schema / properties / pnum / description
        Previous value: -"Goods list page."New value: +"Goods list page, the earlier name of page; page wins when both are set."
    • Changedsubscriptions_read6 fields changed
      • changedInput schema / properties / action / oneOf
        Previous value: -[
        -  {
        -    "const": "plans_list",
        -    "description": "Lists tariff plans."
        -  },
        -  {
        -    "const": "plan_get",
        -    "description": "Returns one tariff plan. Required: plan_id."
        -  },
        -  {
        -    "const": "plan_stats",
        -    "description": "Returns statistics of a tariff plan. Required: plan_id."
        -  },
        -  {
        -    "const": "plan_users",
        -    "description": "Lists the users of a tariff plan. Required: plan_id. Optional: p, page, status, expires_before."
        -  },
        -  {
        -    "const": "legacy_items_list",
        -    "description": "Lists legacy tariffs."
        -  },
        -  {
        -    "const": "legacy_item_get",
        -    "description": "Returns one legacy tariff (id in id or plan_id). Optional: id, plan_id."
        -  },
        -  {
        -    "const": "user_subscriptions",
        -    "description": "Lists the subscriptions of a user. Required: user_id. Optional: p, page, status, expires_before."
        -  },
        -  {
        -    "const": "subscription_get",
        -    "description": "Returns one subscription. Required: subscription_id."
        -  },
        -  {
        -    "const": "access_check",
        -    "description": "Checks whether a user has access through a plan. Optional: user_id, plan_id."
        -  },
        -  {
        -    "const": "subscribers_list",
        -    "description": "Lists subscribers, optionally filtered. Optional: p, page, query, plan_id, status, expires_before."
        -  },
        -  {
        -    "const": "payments_list",
        -    "description": "Lists payments, optionally filtered. Optional: p, page, query, user_id, subscription_id, plan_id, status, date_from, date_to."
        -  },
        -  {
        -    "const": "payment_get",
        -    "description": "Returns one payment. Required: payment_id."
        -  }
        -]New value: +[
        +  {
        +    "const": "plans_list",
        +    "description": "Lists tariff plans. Optional: offset."
        +  },
        +  {
        +    "const": "plan_get",
        +    "description": "Returns one tariff plan. Required: plan_id."
        +  },
        +  {
        +    "const": "plan_stats",
        +    "description": "Returns statistics of a tariff plan. Required: plan_id."
        +  },
        +  {
        +    "const": "plan_users",
        +    "description": "Lists the users of a tariff plan a page at a time. Brief records by default; detail=full gives complete records. The reply has page, per_page, total, has_more, truncated and next. Required: plan_id. Optional: page, p, per_page, offset, detail, status, expires_before."
        +  },
        +  {
        +    "const": "legacy_items_list",
        +    "description": "Lists legacy tariffs. Optional: offset."
        +  },
        +  {
        +    "const": "legacy_item_get",
        +    "description": "Returns one legacy tariff (id in id or plan_id). Optional: id, plan_id."
        +  },
        +  {
        +    "const": "user_subscriptions",
        +    "description": "Lists the subscriptions of a user a page at a time. Brief records by default; detail=full gives complete records. The reply has page, per_page, total, has_more, truncated and next. Required: user_id. Optional: page, p, per_page, offset, detail, status, expires_before."
        +  },
        +  {
        +    "const": "subscription_get",
        +    "description": "Returns one subscription. Required: subscription_id."
        +  },
        +  {
        +    "const": "access_check",
        +    "description": "Checks whether a user has access through a plan. Optional: user_id, plan_id."
        +  },
        +  {
        +    "const": "subscribers_list",
        +    "description": "Lists subscribers, optionally filtered, a page at a time. Brief records by default; detail=full gives complete records. The reply has page, per_page, total, has_more, truncated and next. Optional: page, p, per_page, offset, detail, query, plan_id, status, expires_before."
        +  },
        +  {
        +    "const": "payments_list",
        +    "description": "Lists payments, optionally filtered, a page at a time. Brief records by default; detail=full gives complete records. The reply has page, per_page, total, has_more, truncated and next. Optional: page, p, per_page, offset, detail, query, user_id, subscription_id, plan_id, status, date_from, date_to."
        +  },
        +  {
        +    "const": "payment_get",
        +    "description": "Returns one payment. Required: payment_id."
        +  }
        +]
      • addedInput schema / properties / detail
        Added value: +{
        +  "description": "Record form of a paged list. brief (default): id, status, plan, user id and email, dates (UTC, ISO 8601); payments also the amount. Titles and excerpts are plain text; names, logins, paths, URLs and other identifiers are as the source gives them. full: complete records. A list reply is at most 30 KB and holds every record of its page: a record that does not fit in full comes in brief form, marked detail brief, the reply counts such records in brief_records, and get by id returns the complete record; brief records shorten their excerpts, then keep only their ids and titles. Only a page that does not fit even so is cut: truncated is true and next names the offset to go on from.",
        +  "enum": [
        +    "brief",
        +    "full"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "description": "Records to skip from the start of a list; overrides page. A list reply cut at its size limit names the offset that follows in next.",
        +  "type": "number"
        +}
      • changedInput schema / properties / p / description
        Previous value: -"Page number."New value: +"List page, the earlier name of page; page wins when both are set."
      • changedInput schema / properties / page / description
        Previous value: -"Synonym for p on list actions."New value: +"List page, from 1."
      • addedInput schema / properties / per_page
        Added value: +{
        +  "description": "Records per page: 1-50, 20 by default, larger values count as 50.",
        +  "type": "number"
        +}
    • Changedtemplates_read7 fields changed
      • changedInput schema / properties / action / oneOf
        Previous value: -[
        -  {
        -    "const": "list_modules",
        -    "description": "Lists the modules that have templates, with their template ids."
        -  },
        -  {
        -    "const": "get_variables",
        -    "description": "Returns a template together with the variables available in it. Required: module_id, template_id."
        -  },
        -  {
        -    "const": "read_template",
        -    "description": "Returns the template code and its variables. Required: module_id, template_id."
        -  },
        -  {
        -    "const": "validate_template",
        -    "description": "Checks a full template body (content or html_content) or a code_search/code_paste patch with the same rules as a save. Nothing is saved and no backup is made. Required: module_id, template_id. Optional: content, html_content, code_search, code_paste."
        -  },
        -  {
        -    "const": "list_backups",
        -    "description": "Lists template backups."
        -  },
        -  {
        -    "const": "get_reference",
        -    "description": "Returns the template variables reference (markdown)."
        -  },
        -  {
        -    "const": "get_guide",
        -    "description": "Returns the template editing guide (markdown)."
        -  },
        -  {
        -    "const": "get_backup_guide",
        -    "description": "Returns the template backup guide (markdown)."
        -  },
        -  {
        -    "const": "menu_list",
        -    "description": "Lists site menus."
        -  },
        -  {
        -    "const": "menu_get",
        -    "description": "Returns one menu with its items. Required: menu_id."
        -  },
        -  {
        -    "const": "mail_list_forms",
        -    "description": "Lists mail forms."
        -  },
        -  {
        -    "const": "mail_get_form",
        -    "description": "Returns one mail form. Required: mail_form_id."
        -  },
        -  {
        -    "const": "mail_list_fields",
        -    "description": "Lists the fields of a mail form. Required: mail_form_id."
        -  },
        -  {
        -    "const": "mail_get_template",
        -    "description": "Returns the notification email template of a mail form. Required: mail_form_id."
        -  },
        -  {
        -    "const": "page_list",
        -    "description": "Lists site pages. Optional: page_page, page_per_page."
        -  },
        -  {
        -    "const": "page_get",
        -    "description": "Returns one site page. Required: page_id."
        -  }
        -]New value: +[
        +  {
        +    "const": "list_modules",
        +    "description": "Lists the modules that have templates, with their template ids. Optional: offset."
        +  },
        +  {
        +    "const": "get_variables",
        +    "description": "Returns a template together with the variables available in it. Required: module_id, template_id."
        +  },
        +  {
        +    "const": "read_template",
        +    "description": "Returns the template code and its variables. Required: module_id, template_id."
        +  },
        +  {
        +    "const": "validate_template",
        +    "description": "Checks a full template body (content or html_content) or a code_search/code_paste patch with the same rules as a save. Nothing is saved and no backup is made. Required: module_id, template_id. Optional: content, html_content, code_search, code_paste."
        +  },
        +  {
        +    "const": "list_backups",
        +    "description": "Lists template backups. Optional: offset."
        +  },
        +  {
        +    "const": "get_reference",
        +    "description": "Returns the template variables reference (markdown)."
        +  },
        +  {
        +    "const": "get_guide",
        +    "description": "Returns the template editing guide (markdown)."
        +  },
        +  {
        +    "const": "get_backup_guide",
        +    "description": "Returns the template backup guide (markdown)."
        +  },
        +  {
        +    "const": "menu_list",
        +    "description": "Lists site menus. Optional: offset."
        +  },
        +  {
        +    "const": "menu_get",
        +    "description": "Returns one menu with its items. Required: menu_id."
        +  },
        +  {
        +    "const": "mail_list_forms",
        +    "description": "Lists mail forms. Optional: offset."
        +  },
        +  {
        +    "const": "mail_get_form",
        +    "description": "Returns one mail form. Required: mail_form_id."
        +  },
        +  {
        +    "const": "mail_list_fields",
        +    "description": "Lists the fields of a mail form. Required: mail_form_id. Optional: offset."
        +  },
        +  {
        +    "const": "mail_get_template",
        +    "description": "Returns the notification email template of a mail form. Required: mail_form_id."
        +  },
        +  {
        +    "const": "page_list",
        +    "description": "Lists site pages a page at a time. Brief pages by default, without their content; detail=full gives complete pages, page_get one complete page. The reply has page, per_page, total, has_more, truncated and next. Optional: page, per_page, offset, detail, page_page, page_per_page."
        +  },
        +  {
        +    "const": "page_get",
        +    "description": "Returns one site page. Required: page_id."
        +  }
        +]
      • addedInput schema / properties / detail
        Added value: +{
        +  "description": "Record form of a paged list. brief (default): for site pages id, title, status, parent id, public URL, last change and a plain-text excerpt up to 200 characters. Titles and excerpts are plain text; names, logins, paths, URLs and other identifiers are as the source gives them. full: complete records. A list reply is at most 30 KB and holds every record of its page: a record that does not fit in full comes in brief form, marked detail brief, the reply counts such records in brief_records, and get by id returns the complete record; brief records shorten their excerpts, then keep only their ids and titles. Only a page that does not fit even so is cut: truncated is true and next names the offset to go on from.",
        +  "enum": [
        +    "brief",
        +    "full"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "description": "Records to skip from the start of a list; overrides page. A list reply cut at its size limit names the offset that follows in next.",
        +  "type": "number"
        +}
      • addedInput schema / properties / page
        Added value: +{
        +  "description": "List page, from 1.",
        +  "type": "number"
        +}
      • changedInput schema / properties / page_page / description
        Previous value: -"Page number of the page list."New value: +"page_list: the earlier name of page; page wins when both are set."
      • changedInput schema / properties / page_per_page / description
        Previous value: -"Page size of the page list."New value: +"page_list: the earlier name of per_page; per_page wins when both are set."
      • addedInput schema / properties / per_page
        Added value: +{
        +  "description": "Records per page: 1-50, 20 by default, larger values count as 50.",
        +  "type": "number"
        +}
    • Changedtmaker_read2 fields changed
      • changedInput schema / properties / action / oneOf
        Previous value: -[
        -  {
        -    "const": "skeleton_guide",
        -    "description": "Returns the skeleton guide (markdown)."
        -  },
        -  {
        -    "const": "skeleton_rules",
        -    "description": "Returns the placeholder codes allowed in skeleton HTML."
        -  },
        -  {
        -    "const": "designs_list",
        -    "description": "Lists standard designs."
        -  },
        -  {
        -    "const": "design_get",
        -    "description": "Returns one standard design (id in design_id or id). Optional: design_id, id."
        -  },
        -  {
        -    "const": "project_list",
        -    "description": "Lists saved projects."
        -  },
        -  {
        -    "const": "project_get",
        -    "description": "Returns one saved project (id in project_id or id). Optional: project_id, id."
        -  },
        -  {
        -    "const": "skeleton_validate",
        -    "description": "Checks skeleton HTML without saving it. Required: tmpl."
        -  }
        -]New value: +[
        +  {
        +    "const": "skeleton_guide",
        +    "description": "Returns the skeleton guide (markdown)."
        +  },
        +  {
        +    "const": "skeleton_rules",
        +    "description": "Returns the placeholder codes allowed in skeleton HTML. Optional: offset."
        +  },
        +  {
        +    "const": "designs_list",
        +    "description": "Lists standard designs. Optional: offset."
        +  },
        +  {
        +    "const": "design_get",
        +    "description": "Returns one standard design (id in design_id or id). Optional: design_id, id."
        +  },
        +  {
        +    "const": "project_list",
        +    "description": "Lists saved projects. Optional: offset."
        +  },
        +  {
        +    "const": "project_get",
        +    "description": "Returns one saved project (id in project_id or id). Optional: project_id, id."
        +  },
        +  {
        +    "const": "skeleton_validate",
        +    "description": "Checks skeleton HTML without saving it. Required: tmpl."
        +  }
        +]
      • addedInput schema / properties / offset
        Added value: +{
        +  "description": "Records to skip from the start of a list; overrides page. A list reply cut at its size limit names the offset that follows in next.",
        +  "type": "number"
        +}
    • Changedusers_read5 fields changed
      • changedInput schema / properties / action / oneOf
        Previous value: -[
        -  {
        -    "const": "list",
        -    "description": "Lists site users page by page, optionally filtered by login, id or email. Optional: page, nick, user, user_id, email."
        -  },
        -  {
        -    "const": "get",
        -    "description": "Returns one user by id, login or email. Optional: user_id, nick, user, email."
        -  },
        -  {
        -    "const": "groups",
        -    "description": "Lists user groups."
        -  },
        -  {
        -    "const": "groups_list",
        -    "description": "Lists user groups (same as groups)."
        -  },
        -  {
        -    "const": "groups_rights",
        -    "description": "Lists the permission codes that a group can have."
        -  },
        -  {
        -    "const": "group_permissions",
        -    "description": "Returns the permissions of one group (group id in id or gid). Optional: id, gid."
        -  },
        -  {
        -    "const": "ranks",
        -    "description": "Lists user ranks."
        -  },
        -  {
        -    "const": "fields",
        -    "description": "Lists user profile fields."
        -  }
        -]New value: +[
        +  {
        +    "const": "list",
        +    "description": "Lists site users page by page, optionally filtered by login, id or email. Brief users by default; detail=full gives complete profiles, get one complete user. The reply has page, per_page, total, has_more, truncated and next. Optional: page, per_page, offset, detail, nick, user, user_id, email."
        +  },
        +  {
        +    "const": "get",
        +    "description": "Returns one user by id, login or email. Optional: user_id, nick, user, email."
        +  },
        +  {
        +    "const": "groups",
        +    "description": "Lists user groups. Optional: offset."
        +  },
        +  {
        +    "const": "groups_list",
        +    "description": "Lists user groups (same as groups). Optional: offset."
        +  },
        +  {
        +    "const": "groups_rights",
        +    "description": "Lists the permission codes that a group can have. Optional: offset."
        +  },
        +  {
        +    "const": "group_permissions",
        +    "description": "Returns the permissions of one group (group id in id or gid). Optional: id, gid."
        +  },
        +  {
        +    "const": "ranks",
        +    "description": "Lists user ranks. Optional: offset."
        +  },
        +  {
        +    "const": "fields",
        +    "description": "Lists user profile fields. Optional: offset."
        +  }
        +]
      • addedInput schema / properties / detail
        Added value: +{
        +  "description": "Record form of a paged list. brief (default): id, login, full name, email, group, status (active or banned) and registration date (UTC, ISO 8601). Titles and excerpts are plain text; names, logins, paths, URLs and other identifiers are as the source gives them. full: complete records. A list reply is at most 30 KB and holds every record of its page: a record that does not fit in full comes in brief form, marked detail brief, the reply counts such records in brief_records, and get by id returns the complete record; brief records shorten their excerpts, then keep only their ids and titles. Only a page that does not fit even so is cut: truncated is true and next names the offset to go on from.",
        +  "enum": [
        +    "brief",
        +    "full"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "description": "Records to skip from the start of a list; overrides page. A list reply cut at its size limit names the offset that follows in next.",
        +  "type": "number"
        +}
      • changedInput schema / properties / page / description
        Previous value: -"Page number of the user list."New value: +"List page, from 1."
      • addedInput schema / properties / per_page
        Added value: +{
        +  "description": "Records per page: 1-50, 20 by default, larger values count as 50.",
        +  "type": "number"
        +}
  9. 1 tool update
    • Changedskills_tool1 field changed
      • changedInput schema / properties / action / description
        Previous value: -"resolve — match skill by task. catalog — GitHub list. status — check_paths of a skill installation. install — source and target location of a skill. register_usage — site usage tracking (select_site)."New value: +"resolve — match skill by task. catalog — GitHub list. status — check_paths of a skill installation. install — source and target location of a skill. register_usage — site usage tracking (select_site); best effort: recorded=false with a message when tracking is temporarily unavailable."
  10. 44 tool updates
    • Addedapps_delete
    • Addedapps_read
    • Removedapps_tool
    • Addedapps_write
    • Addedcontent_delete
    • Addedcontent_read
    • Removedcontent_tool
    • Addedcontent_write
    • Changeddocs_tool1 field changed
      • changedInput schema / properties / url / description
        Previous value: -"Direct YAML URL for fetch_spec (https://api.ucoz.net/{module}-openapi.yaml)."New value: +"Direct YAML URL for fetch_spec; only https://api.ucoz.net/{module}-openapi.yaml is accepted."
    • Addedfiles_delete
    • Addedfiles_read
    • Removedfiles_tool
    • Addedfiles_write
    • Addedforum_delete
    • Addedforum_read
    • Addedforum_write
    • Addedmodules_read
    • Removedmodules_tool
    • Addedmodules_uninstall
    • Addedmodules_write
    • Addedsettings_read
    • Removedsettings_tool
    • Addedsettings_write
    • Addedshop_delete
    • Addedshop_read
    • Removedshop_tool
    • Addedshop_write
    • Addedsubscriptions_delete
    • Addedsubscriptions_read
    • Removedsubscriptions_tool
    • Addedsubscriptions_write
    • Addedtemplates_delete
    • Addedtemplates_read
    • Removedtemplates_tool
    • Addedtemplates_write
    • Addedtmaker_delete
    • Addedtmaker_publish
    • Addedtmaker_read
    • Removedtmaker_tool
    • Addedtmaker_write
    • Addedusers_delete
    • Addedusers_read
    • Removedusers_tool
    • Addedusers_write
  11. 1 tool update
    • Addedsettings_tool
  12. 1 tool update
    • Changedskills_tool5 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"resolve — match skill by task. catalog — GitHub list. status — local check_paths (host agent verifies). install — install_command for host agent. register_usage — site usage tracking (select_site)."New value: +"resolve — match skill by task. catalog — GitHub list. status — check_paths of a skill installation. install — source and target location of a skill. register_usage — site usage tracking (select_site)."
      • changedInput schema / properties / client / description
        Previous value: -"IDE client for status/install path hints (default auto → cursor)."New value: +"IDE client for status/install paths (default auto → cursor)."
      • changedInput schema / properties / compare / description
        Previous value: -"status: include catalog latest_version for update hints."New value: +"status: include catalog latest_version."
      • removedInput schema / properties / method
        Removed value: -{
        -  "description": "install: npx skills add (recommended) or git sparse copy hint.",
        -  "enum": [
        -    "auto",
        -    "npx",
        -    "copy"
        -  ],
        -  "type": "string"
        -}
      • changedInput schema / properties / skill_path / description
        Previous value: -"register_usage only on host: path to SKILL.md (account MCP: prefer skill_id + version)."New value: +"register_usage: path to SKILL.md (alternative to skill_id + version)."
  13. 3 tool updates
    • Changedfiles_tool8 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"list — GET /uapi/files (default path is root, sort=name, no filter). info — GET /uapi/files/info. content_get — GET /uapi/files/content. content_put — PUT /uapi/files/content. quota — GET /uapi/files/quota, no arguments. upload — POST /uapi/files/upload (multipart field file, repeatable). upload_url — POST /uapi/files/upload_url. upload_direct — mint a one-shot curl URL (filename and size; call select_site first). POST the raw file to upload_url. The response is upload_id, filename, and size. Pass that upload_id to content_tool or shop_tool as *_upload_id when updating the material. mkdir — POST /uapi/files/mkdir. rename — POST /uapi/files/rename (one object fails the request; items is always HTTP 200). move — POST /uapi/files/move (one path fails the request; paths is always HTTP 200). delete — DELETE /uapi/files (confirm; missing targets fail the request, otherwise HTTP 200 with results)."New value: +"list — GET /uapi/files (default path is root, sort=name, no filter). info — GET /uapi/files/info. content_get — GET /uapi/files/content. content_put — PUT /uapi/files/content. quota — GET /uapi/files/quota, no arguments. upload — POST /uapi/files/upload (multipart field file, repeatable); bytes come from files/content/content_base64 and from upload_id/upload_ids. upload_url — POST /uapi/files/upload_url. upload_direct — mint a one-shot curl URL (filename and size; call select_site first). POST the raw file to upload_url. The response is upload_id, filename, size, and sha256. Pass that upload_id to action=upload with path to place it in the file manager, or to content_tool or shop_tool as *_upload_id when updating the material. mkdir — POST /uapi/files/mkdir. rename — POST /uapi/files/rename (one object fails the request; items is always HTTP 200). move — POST /uapi/files/move (one path fails the request; paths is always HTTP 200). delete — DELETE /uapi/files (confirm; missing targets fail the request, otherwise HTTP 200 with results)."
      • changedInput schema / properties / content_base64 / description
        Previous value: -"upload: base64 body of a single binary file when files is omitted."New value: +"upload: standard base64 body of a single binary file when files is omitted. Foreign characters or a truncated length fail the call."
      • addedInput schema / properties / files / items / properties / sha256
        Added value: +{
        +  "description": "Expected SHA-256 hex of this body after decoding.",
        +  "type": "string"
        +}
      • addedInput schema / properties / files / items / properties / size
        Added value: +{
        +  "description": "Expected byte size of this body after decoding.",
        +  "type": "number"
        +}
      • addedInput schema / properties / sha256
        Added value: +{
        +  "description": "upload: expected SHA-256 hex of the single top-level body after base64 decoding; a mismatch fails the call.",
        +  "type": "string"
        +}
      • changedInput schema / properties / size / description
        Previous value: -"upload_direct: exact byte size of the file that will be POSTed to upload_url (1..16777216). The curl body must match it exactly."New value: +"upload_direct: exact byte size of the file that will be POSTed to upload_url (1..16777216). The curl body must match it exactly. upload: expected byte size of the single top-level body after base64 decoding; a mismatch fails the call."
      • addedInput schema / properties / upload_id
        Added value: +{
        +  "description": "upload: id from upload_direct whose bytes were already POSTed. Saved into path under its upload_direct filename, or name when it is the only file. Spent only when that item is uploaded; otherwise it stays usable until it expires.",
        +  "type": "string"
        +}
      • addedInput schema / properties / upload_ids
        Added value: +{
        +  "description": "upload: several upload_direct ids (a comma-separated string is accepted too), sent after upload_id and inline files. At most 20.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
    • Changedtemplates_tool4 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"Template actions use module_id + template_id. Destructive actions need confirm: true."New value: +"Template actions use module_id + template_id. Destructive actions need confirm: true. update_template / patch_template make an automatic backup (source mcp, rotated) after validation and before saving; the save is refused if that backup fails, and the result carries backup.id. validate_template checks content (or code_search + code_paste) with the same rules as a save, without saving or backing up. create_backup makes a manual backup (source cp, never rotated, refused with LIMIT_REACHED when full) and returns backup.id."
      • changedInput schema / properties / code_paste / description
        Previous value: -"Replacement fragment (patch_template; empty string deletes match)."New value: +"Replacement fragment (patch_template / validate_template; empty string deletes match)."
      • changedInput schema / properties / code_search / description
        Previous value: -"Exact fragment to find (patch_template)."New value: +"Exact fragment to find (patch_template, or validate_template to check a patch)."
      • changedInput schema / properties / content / description
        Previous value: -"Global block HTML (gblock_create) or validate_template body."New value: +"Global block HTML (gblock_create) or full template body to check (validate_template; html_content is accepted too)."
    • Changedtmaker_tool1 field changed
      • changedInput schema / properties / action / description
        Previous value: -"skeleton_guide — markdown guide (no uAPI). skeleton_rules — placeholder codes. designs_list / design_get — standard designs (design_id). project_list / project_get — saved projects (project_id). skeleton_validate / skeleton_archive / project_save* — POST tmpl. skeleton_publish — POST export (confirm; overwrites all site templates). project_delete — DELETE project (confirm)."New value: +"skeleton_guide — markdown guide (no uAPI). skeleton_rules — placeholder codes. designs_list / design_get — standard designs (design_id). project_list / project_get — saved projects (project_id). skeleton_validate / skeleton_archive / project_save* — POST tmpl. skeleton_publish — POST export (confirm; overwrites all site templates; makes an automatic template backup first, source mcp, returned as data.backup; publish is refused if the backup fails). project_delete — DELETE project (confirm)."
  14. 3 tool updates
    • Changedcontent_tool31 fields changed
      • addedInput schema / properties / archive_base64
        Added value: +{
        +  "description": "Base64 archive body with archive_filename (remote upload). Wins over archive_upload_id, archive_site_path, and archive_path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / archive_filename
        Added value: +{
        +  "description": "File name for archive_base64, with extension.",
        +  "type": "string"
        +}
      • changedInput schema / properties / archive_path / description
        Previous value: -"Server path for load archive."New value: +"Local MCP server path for load archive. Missing files are an error; remote agents must use archive_base64, archive_upload_id, or archive_site_path."
      • addedInput schema / properties / archive_site_path
        Added value: +{
        +  "description": "File already on the site (img/x.jpg or its full site URL). Wins over archive_path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / archive_upload_id
        Added value: +{
        +  "description": "upload_id from upload_direct. Wins over archive_site_path and archive_path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / cover_base64
        Added value: +{
        +  "description": "Base64 cover body with cover_filename (remote upload). Wins over cover_upload_id, cover_site_path, and cover_path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / cover_filename
        Added value: +{
        +  "description": "File name for cover_base64, with extension.",
        +  "type": "string"
        +}
      • changedInput schema / properties / cover_path / description
        Previous value: -"Server path for cover upload."New value: +"Local MCP server path for cover upload. Missing files are an error; remote agents must use cover_base64, cover_upload_id, or cover_site_path."
      • addedInput schema / properties / cover_site_path
        Added value: +{
        +  "description": "File already on the site (img/x.jpg or its full site URL). Wins over cover_path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / cover_upload_id
        Added value: +{
        +  "description": "upload_id from upload_direct. Wins over cover_site_path and cover_path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / file_base64
        Added value: +{
        +  "description": "Base64 file body with file_filename (remote upload). Wins over file_upload_id, file_site_path, and file_path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / file_filename
        Added value: +{
        +  "description": "File name for file_base64, with extension.",
        +  "type": "string"
        +}
      • changedInput schema / properties / file_path / description
        Previous value: -"Server path for file/photo/archive upload."New value: +"Local MCP server path for file/photo/archive upload. Missing files are an error; remote agents must use file_base64, file_upload_id, or file_site_path."
      • addedInput schema / properties / file_site_path
        Added value: +{
        +  "description": "File already on the site (img/x.jpg or its full site URL). Wins over file_path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / file_upload_id
        Added value: +{
        +  "description": "upload_id from upload_direct. Wins over file_site_path and file_path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / image_base64
        Added value: +{
        +  "description": "Base64 image body with image_filename (remote upload). Wins over image_upload_id, image_site_path, and image_path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / image_filename
        Added value: +{
        +  "description": "File name for image_base64, with extension.",
        +  "type": "string"
        +}
      • changedInput schema / properties / image_path / description
        Previous value: -"Server path for image (entry file1 or category file)."New value: +"Local MCP server path for image (entry file1 or category file). Missing files are an error; remote agents must use image_base64, image_upload_id, or image_site_path."
      • addedInput schema / properties / image_site_path
        Added value: +{
        +  "description": "File already on the site (img/x.jpg or its full site URL). Wins over image_path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / image_upload_id
        Added value: +{
        +  "description": "upload_id from upload_direct for the first material image (multipart file1). Wins over image_site_path and image_path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / image_upload_ids
        Added value: +{
        +  "description": "Comma-separated upload_id values from upload_direct. They fill material image slots file1, file2, and so on, after image_upload_id when that is also set. At most 50.",
        +  "type": "string"
        +}
      • addedInput schema / properties / photo_base64
        Added value: +{
        +  "description": "Base64 photo body with photo_filename (remote upload). Wins over photo_upload_id, photo_site_path, and photo_path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / photo_filename
        Added value: +{
        +  "description": "File name for photo_base64, with extension.",
        +  "type": "string"
        +}
      • changedInput schema / properties / photo_path / description
        Previous value: -"Server path for photo upload (multipart)."New value: +"Local MCP server path for photo upload (multipart). Missing files are an error; remote agents must use photo_base64, photo_upload_id, or photo_site_path."
      • addedInput schema / properties / photo_site_path
        Added value: +{
        +  "description": "File already on the site (img/x.jpg or its full site URL). Wins over photo_path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / photo_upload_id
        Added value: +{
        +  "description": "upload_id from upload_direct. Wins over photo_site_path and photo_path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / screenshot_base64
        Added value: +{
        +  "description": "Base64 screenshot body with screenshot_filename (remote upload). Wins over screenshot_upload_id, screenshot_site_path, and screenshot_path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / screenshot_filename
        Added value: +{
        +  "description": "File name for screenshot_base64, with extension.",
        +  "type": "string"
        +}
      • changedInput schema / properties / screenshot_path / description
        Previous value: -"Server path for load/video screenshot."New value: +"Local MCP server path for load/video screenshot. Missing files are an error; remote agents must use screenshot_base64, screenshot_upload_id, or screenshot_site_path."
      • addedInput schema / properties / screenshot_site_path
        Added value: +{
        +  "description": "File already on the site (img/x.jpg or its full site URL). Wins over screenshot_path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / screenshot_upload_id
        Added value: +{
        +  "description": "upload_id from upload_direct. Wins over screenshot_site_path and screenshot_path.",
        +  "type": "string"
        +}
    • Changedfiles_tool4 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"list — GET /uapi/files (default path is root, sort=name, no filter). info — GET /uapi/files/info. content_get — GET /uapi/files/content. content_put — PUT /uapi/files/content. quota — GET /uapi/files/quota, no arguments. upload — POST /uapi/files/upload (multipart field file, repeatable). upload_url — POST /uapi/files/upload_url. mkdir — POST /uapi/files/mkdir. rename — POST /uapi/files/rename (one object fails the request; items is always HTTP 200). move — POST /uapi/files/move (one path fails the request; paths is always HTTP 200). delete — DELETE /uapi/files (confirm; missing targets fail the request, otherwise HTTP 200 with results)."New value: +"list — GET /uapi/files (default path is root, sort=name, no filter). info — GET /uapi/files/info. content_get — GET /uapi/files/content. content_put — PUT /uapi/files/content. quota — GET /uapi/files/quota, no arguments. upload — POST /uapi/files/upload (multipart field file, repeatable). upload_url — POST /uapi/files/upload_url. upload_direct — mint a one-shot curl URL (filename and size; call select_site first). POST the raw file to upload_url. The response is upload_id, filename, and size. Pass that upload_id to content_tool or shop_tool as *_upload_id when updating the material. mkdir — POST /uapi/files/mkdir. rename — POST /uapi/files/rename (one object fails the request; items is always HTTP 200). move — POST /uapi/files/move (one path fails the request; paths is always HTTP 200). delete — DELETE /uapi/files (confirm; missing targets fail the request, otherwise HTTP 200 with results)."
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "list",
        -  "info",
        -  "content_get",
        -  "content_put",
        -  "quota",
        -  "upload",
        -  "upload_url",
        -  "mkdir",
        -  "rename",
        -  "move",
        -  "delete"
        -]New value: +[
        +  "list",
        +  "info",
        +  "content_get",
        +  "content_put",
        +  "quota",
        +  "upload",
        +  "upload_url",
        +  "upload_direct",
        +  "mkdir",
        +  "rename",
        +  "move",
        +  "delete"
        +]
      • changedInput schema / properties / filename / description
        Previous value: -"upload: original name of a single file (multipart filename). Falls back to name."New value: +"upload and upload_direct: original file name (multipart filename). Falls back to name."
      • addedInput schema / properties / size
        Added value: +{
        +  "description": "upload_direct: exact byte size of the file that will be POSTed to upload_url (1..16777216). The curl body must match it exactly.",
        +  "type": "number"
        +}
    • Changedshop_tool14 fields changed
      • addedInput schema / properties / file_base64
        Added value: +{
        +  "description": "Synonym for image_base64.",
        +  "type": "string"
        +}
      • addedInput schema / properties / file_filename
        Added value: +{
        +  "description": "Synonym for image_filename.",
        +  "type": "string"
        +}
      • changedInput schema / properties / file_path / description
        Previous value: -"Synonym for image_path."New value: +"Synonym for image_path (local MCP server path)."
      • addedInput schema / properties / file_site_path
        Added value: +{
        +  "description": "Synonym for image_site_path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / file_upload_id
        Added value: +{
        +  "description": "Synonym for image_upload_id.",
        +  "type": "string"
        +}
      • addedInput schema / properties / image_base64
        Added value: +{
        +  "description": "Base64 image body with image_filename (remote upload). Wins over image_upload_id, image_site_path, and image_path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / image_filename
        Added value: +{
        +  "description": "File name for image_base64, with extension.",
        +  "type": "string"
        +}
      • changedInput schema / properties / image_path / description
        Previous value: -"Server path for image upload."New value: +"Local MCP server path for image upload. Missing files are an error; remote agents must use image_base64, image_upload_id, or image_site_path."
      • changedInput schema / properties / image_paths / description
        Previous value: -"Comma-separated local paths (img_add)."New value: +"Comma-separated local MCP server paths (img_add). Missing files are an error."
      • addedInput schema / properties / image_site_path
        Added value: +{
        +  "description": "File already on the site (img/x.jpg or its full site URL). Wins over image_path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / image_site_paths
        Added value: +{
        +  "description": "Comma-separated site files for img_add (img/x.jpg or full site URLs).",
        +  "type": "string"
        +}
      • addedInput schema / properties / image_upload_id
        Added value: +{
        +  "description": "upload_id from upload_direct. Wins over image_site_path and image_path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / image_upload_ids
        Added value: +{
        +  "description": "Comma-separated upload_id values from upload_direct for img_add.",
        +  "type": "string"
        +}
      • addedInput schema / properties / images
        Added value: +{
        +  "description": "Files for img_add (remote upload). Each item is { filename, content_base64 }, { upload_id }, or { site_path }. Appended as file_add_N after the image_*/file_* slots.",
        +  "items": {
        +    "properties": {
        +      "content_base64": {
        +        "description": "Base64 file body.",
        +        "type": "string"
        +      },
        +      "filename": {
        +        "description": "File name with extension (content_base64 items).",
        +        "type": "string"
        +      },
        +      "site_path": {
        +        "description": "File already on the site (img/x.jpg or its full site URL).",
        +        "type": "string"
        +      },
        +      "upload_id": {
        +        "description": "upload_id from upload_direct.",
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
  15. 1 tool update
    • Changedcontent_tool3 fields changed
      • changedInput schema / properties / meta_description / description
        Previous value: -"Meta description."New value: +"Meta description for an entry or a module category."
      • changedInput schema / properties / meta_keywords / description
        Previous value: -"Meta keywords."New value: +"Meta keywords for an entry or a module category."
      • changedInput schema / properties / meta_title / description
        Previous value: -"Meta title."New value: +"Meta title for an entry or a module category."
  16. 1 tool update
    • Addedapps_tool
  17. 14 tool updates
    • First observedcontent_tool
    • First observedcreate_site
    • First observeddocs_tool
    • First observedfiles_tool
    • First observedftp_tool
    • First observedlist_sites
    • First observedmodules_tool
    • First observedselect_site
    • First observedshop_tool
    • First observedskills_tool
    • First observedsubscriptions_tool
    • First observedtemplates_tool
    • First observedtmaker_tool
    • First observedusers_tool

Related MCP Connectors

Related MCP Servers

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.