1C Testpilot
1C Testpilot is an MCP server for AI agents to connect to, control, inspect, and automate 1C:Enterprise test clients via UI and data operations.
Connect, launch, and stop local or remote 1C test clients; manage multiple connections and profiles, and handle session logging.
Navigate UI windows and forms: find objects, read active window, child objects, command interface, user messages, errors, screenshots, performance, and action limits.
Read and modify fields: click, input/clear text, toggle checkboxes, select from drop lists/choice forms, and bulk-read/write fields.
Work with tables and trees: read, search, filter, sort, navigate, select, add/delete/copy rows, edit cells, and manage list settings.
Work with documents and spreadsheets: read areas, find text, edit spreadsheet areas, follow hyperlinks, and save/export content.
Use calendar fields, form navigation, snapshots, and form-state comparison to track changes.
Record and replay UI scenarios as XML uilog, with pause/resume/cancel and failure reporting.
Generate HTML/Allure reports, JSONL logs, and screenshots during sessions.
With enabled extras: run BSL code and queries, read metadata, and call custom BSL functions (per README).
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@1C Testpilotopen the sales order form and read the customer field"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
1C Testpilot
MCP-сервер для работы AI-агентов с интерфейсом 1С:Предприятия. Позволяет агенту открывать формы, читать и изменять данные, работать с таблицами, записывать и воспроизводить сценарии действий.
Сервер подключается напрямую к локальному или удалённому клиенту тестирования 1С по его сетевому протоколу.
Возможности
Подключение к локальному или удалённому тест-клиенту по адресу и порту; порядок подключения определяется автоматически.
Запуск/останов тест-клиента 1С на компьютере MCP-сервера (файловая или серверная база, логин/пароль) с ожиданием готовности и авто-подключением —
tc_session(action="launch_client"/"stop_client").Навигация по дереву UI: активное окно → форма → элементы (по иерархическим ключам).
Чтение: значения полей, вид/класс/заголовки элементов, таблицы, области табличного документа.
Действия: ввод текста/HTML, клики, флажки, выбор из списков/меню, работа с таблицами и деревом, календарь, гиперссылки, навигация по строкам и окнам.
clickпри включённом READBACK возвращает активное окно.diagnostics=Trueдополнительно читает текущие сообщения окна; они могут относиться к предыдущим действиям.Обзор формы —
get_context: первое чтение возвращает описание, следующие — изменения;result_mode="full"возвращает всё заново.save_as_snapshot=Trueотдельно сохраняет фиксированный снимок для сравнения. Сохранение состояния не требует повторного чтения.Сравнение состояния формы:
create_snapshotсохраняет снимок,compare_snapshotпоказывает изменения относительно текущего состояния.include_tables=Trueпри создании снимка или обзоре формы добавляет сравнение строк по порядку, без раскрытия дерева. Строки остаются выделенными; на 8.3 подготовка может вызвать обработчики активации строки. Список и удаление —list_snapshotsиdelete_snapshot. Снимки хранятся в памяти до удаления, вытеснения или остановки сервера.Чтение нескольких полей —
read_fields; заполнение полей формы —set_fields, ячеек текущей строки таблицы —set_row_values; добавление заполненных строк —add_rows. При заполненииtextзадаёт текст поля,checked— нужное состояние флажка. Вset_fieldsпараметрselectвыбирает значение через список или форму выбора. Заполнение проверяет принятые значения и останавливается при проблеме, сохраняя результат выполненных шагов.read_documentчитает табличный документ целиком или прямоугольную область;find_textищет текст и возвращает адреса подходящих ячеек.Поиск строк таблицы:
find_rowsотбирает прочитанные строки по тексту колонок с учётом текущих отборов и свёрнутых узлов. Это не поиск по всей базе.Поиск в списке средствами 1С —
search: вводит текст в строку поиска и возвращает строки после проверки стабильности результата; пустой текст очищает поиск.Выбор значения поля —
select_value: по точному тексту из выпадающего списка или по значениям колонок формы выбора, с проверкой результата.Настройки списка:
get_list_settingsчитает отборы и сортировку,get_list_settings_fields— доступные поля,set_list_settingsизменяет настройки.Запись и воспроизведение сценариев (uilog): агент выполняет шаги → получает XML-сценарий → воспроизводит его. Два режима записи (см. переменные окружения).
10 инструментов по типам объектов клиента тестирования; конкретная операция выбирается параметром
action(до 160 действий). Версионный гейтинг по целевой версии платформы.Совместимые сценарии Тестера: запуск поддерживаемого BSL из файлов через MCP и Python API, с параметрами и вложенными сценариями.
Related MCP server: 1C MCP Toolkit
Требования
Windows, Linux или macOS для MCP-сервера. Платформа 1С (напр. 8.3.27 или 8.5.1) нужна на компьютере тест-клиента.
Python 3.10+.
Тест-клиент 1С — либо поднимается действием
tc_session(action="launch_client"), либо запускается заранее:1cv8.exe ENTERPRISE /F"<база>" /TESTCLIENT -TPort <порт>
Установка
Для сценариев на Python доступен Python API с интеграцией pytest. Тесты используют те же операции с 1С напрямую, без запуска MCP-сервера.
Установка из репозитория GitHub. Нужны Git и pipx.
pipx install git+https://github.com/ROCTUP/1c-testpilot.git
pipx ensurepathПосле установки перезапустите терминал и MCP-клиент, чтобы они увидели команду 1c-testpilot.
Зависимости устанавливаются автоматически в отдельное окружение.
Если репозиторий уже скачан, установите проект из его корневой папки:
pipx install .Подключение к MCP-клиенту
Выберите способ подключения: stdio — MCP-клиент сам запускает 1C Testpilot; Streamable HTTP — вы запускаете сервер отдельно, а MCP-клиент подключается по URL.
Через stdio
Команда 1c-testpilot должна быть доступна в PATH MCP-клиента. Если клиент её не находит,
укажите в command полный путь к исполняемому файлу.
Claude Desktop (документация).
Откройте Settings → Developer → Edit Config и добавьте сервер в mcpServers:
Windows:
%APPDATA%\Claude\claude_desktop_config.json.macOS:
~/Library/Application Support/Claude/claude_desktop_config.json.
{
"mcpServers": {
"1c-testpilot": {
"command": "1c-testpilot",
"env": { "TC1C_TRANSPORT": "stdio" }
}
}
}После изменения файла полностью перезапустите Claude Desktop.
Claude Code (документация):
claude mcp add --env TC1C_TRANSPORT=stdio --transport stdio --scope user 1c-testpilot -- 1c-testpilot--scope user делает сервер доступным во всех проектах. Состояние подключения можно
посмотреть командой /mcp внутри Claude Code.
Codex (документация).
Добавьте в ~/.codex/config.toml:
[mcp_servers.1c-testpilot]
command = "1c-testpilot"
env = { TC1C_TRANSPORT = "stdio" }Или добавьте сервер через CLI:
codex mcp add 1c-testpilot --env TC1C_TRANSPORT=stdio -- 1c-testpilotСостояние подключения — /mcp в Codex. Для длительных операций, например запуска 1С,
можно добавить tool_timeout_sec = 120 в секцию сервера; стандартный таймаут Codex — 60 секунд.
Без установки пакета можно указать напрямую: "command": "python", "args": ["<путь>/app/server.py"].
Через Streamable HTTP
Запустите 1C Testpilot в отдельном терминале.
Windows, PowerShell:
$env:TC1C_TRANSPORT = "streamable-http"
$env:TC1C_HTTP_HOST = "127.0.0.1"
$env:TC1C_HTTP_PORT = "6004"
$env:TC1C_HTTP_PATH = "/mcp"
1c-testpilotLinux, Bash:
TC1C_TRANSPORT=streamable-http TC1C_HTTP_HOST=127.0.0.1 TC1C_HTTP_PORT=6004 TC1C_HTTP_PATH=/mcp 1c-testpilotПока сервер работает, он принимает MCP-подключения по адресу http://127.0.0.1:6004/mcp.
Настройки TC1C_* задаются в окружении этого процесса сервера.
Claude Code:
claude mcp add --transport http --scope user 1c-testpilot http://127.0.0.1:6004/mcpЭта настройка работает и в локальных сессиях вкладки Code приложения Claude Desktop: они используют MCP-конфигурацию Claude Code. Подключение к HTTP-серверу выполняется напрямую. Документация Claude Code Desktop.
Если сервер с таким именем уже добавлен через stdio, сначала удалите прежнюю запись
командой claude mcp remove --scope user 1c-testpilot.
Codex — используйте URL в секции сервера в ~/.codex/config.toml:
[mcp_servers.1c-testpilot]
url = "http://127.0.0.1:6004/mcp"При переходе со stdio замените прежние command, args и env на url.
Для новой записи можно использовать CLI:
codex mcp add 1c-testpilot --url http://127.0.0.1:6004/mcpДля подключения с другого компьютера задайте TC1C_HTTP_HOST равным сетевому IP компьютера
с 1C Testpilot и укажите этот IP в URL клиента. Порт 6004 должен быть доступен из сети клиента.
Встроенной HTTP-аутентификации в 1C Testpilot нет; доступ к серверу ограничивается вашей сетью
или внешним прокси с аутентификацией и HTTPS.
Также поддерживается прежний транспорт SSE: TC1C_TRANSPORT=sse, адрес подключения
http://127.0.0.1:6004/sse. У него стандартные пути /sse и /messages/;
TC1C_HTTP_PATH применяется только к Streamable HTTP.
Подключение к клиенту тестирования 1С
Адрес, порт и версия платформы 1С передаются инструменту tc_session при выполнении
действия connect. Эти параметры относятся к клиенту тестирования 1С и не задаются
в конфигурации подключения MCP. Запуск клиента выполняется действием launch_client.
При локальном подключении
hostможно опустить: по умолчанию127.0.0.1.Удалённый клиент запустите с
/TESTCLIENT -TPort <порт>; его порт должен быть доступен с компьютера MCP-сервера.launch_clientиstop_clientработают на компьютере MCP-сервера. На Linux для обычного запуска клиента нужен графический сеанс; для подключения к уже запущенному — не нужен.На macOS обычный запуск не требует
DISPLAY; поиск платформы учитывает путь/opt/1cv8/<версия>/.desktop="isolated"иget_screenshotна macOS не поддерживаются.На Windows 10+ и Linux параметр
desktop="isolated"вlaunch_clientзапускает 1С на отдельном рабочем столе, не мешая пользователю. По умолчанию —desktop="default", обычный запуск. Изолированные клиенты поддерживают скриншоты и завершаются вместе с MCP-сервером. На Linux требуется Xvfb (sudo apt install xvfbв Ubuntu/Debian); графический сеанс не нужен.Можно работать с несколькими базами или одной базой под разными пользователями. Подключение выбирается через
connection_id, список —tc_session(action="list_connections").
При автоматическом выборе исполняемого файла используется самая новая подходящая установка.
Учитываются также установки только тонкого клиента. Например,
version="8.3.27" выбирает самую новую сборку этой ветки. Для определённой сборки
укажите полную версию или путь exe.
Именованные профили
Настройки запуска и подключения можно сохранить в YAML-файле
(примеры всех допустимых параметров), указав его путь в TC1C_PROFILES_FILE.
tc_session(action="list_profiles") показывает доступные профили;
launch_client(profile="ut_admin") запускает клиент, connect(profile="remote_demo")
подключается к работающему. Оба действия относятся к tc_session.
Явно переданные параметры переопределяют профиль. Имя использованного профиля видно в list_connections.
Для запуска профиль содержит base и параметры launch_client, для подключения — port
и необязательные host, version. Для серверной базы укажите server: true и base: 'server1c\Trade'.
description задаёт описание. Пароль — строка в password
или значение переменной окружения с именем из password_env; одновременно их задавать нельзя.
Пароли в YAML заключайте в кавычки. Значения паролей не выводятся в списке профилей и журнале;
при запуске 1С пароль передаётся в командной строке процесса.
Файл перечитывается при обращении. Относительные пути base, exe и code_epf в профиле считаются от его папки.
wait задаёт общий срок запуска и готовности подключения в секундах: по умолчанию 120.
Для долгой загрузки базы его можно увеличить, например wait: 180. Ожидание заканчивается
сразу после подключения; само открытие порта ещё не означает готовность клиента.
Переменные окружения
Задаются в окружении процесса сервера или в файле по образцу .env.example:
1c-testpilot --env-file "D:/Testpilot/.env"При запуске из MCP-клиента добавьте аргументы к команде:
{
"mcpServers": {
"1c-testpilot": {
"command": "1c-testpilot",
"args": ["--env-file", "D:/Testpilot/.env"]
}
}
}Путь к файлу — абсолютный или относительно рабочего каталога сервера. Переменные окружения
имеют приоритет над значениями файла. Без --env-file файл .env не загружается;
если указанный файл недоступен, сервер сообщает об ошибке и не запускается.
TC1C_PROFILES_FILE— путь к YAML-файлу профилей, абсолютный или от рабочего каталога сервера. По умолчанию не задан.TC1C_CONNECTION_LIMIT— максимум зарегистрированных подключений, по умолчанию16. Отключённый клиент, запущенный сервером, учитывается доstop_client. Лимит ссылокTC1C_REF_LIMITприменяется отдельно к каждому подключению.TC1C_QUEUE_TIMEOUT— максимальное ожидание очереди к занятому соединению, по умолчанию60секунд; положительное число. По истечении сервер возвращаетconnection_busyс текущим действием и длительностью его выполнения. Таймаут самого выполняющегося действия задаётся отдельно.list_connectionsпоказываетbusy,active_action,active_seconds; после обнаруженного обрыва сокета —connected=false.tc_session(action="disconnect", force=true)прерывает сетевое ожидание без очереди. В Python API —client.disconnect(force=True). Приложение 1С продолжает работать; результат прерванного действия может быть неизвестен (outcome_unknown).cleanup_pending=trueозначает, что обработчик ещё освобождает состояние соединения; дождитесьbusy=falseлибо удаления подключения из списка перед повторным подключением.TC1C_RECORD_MODE— режим записи сценариев:synth(по умолчанию — сервер собирает сценарий из вызовов инструментов, покрывая все действия агента) илиnative(журнал тест-клиента; составное чтение таблицы сервер дополняет командами снятия выделения).TC_PLATFORM_VERSION— целевая версия платформы (напр.8.3.24.1548): действия, чей метод в этой версии отсутствует, не публикуются; версия используется в рукопожатии.TC1C_RESPONSE_FORMAT— формат ответов:toon(по умолчанию) илиjson(режим совместимости).TC1C_RESPONSE_DETAIL—compact(по умолчанию) сокращает служебные поля успешных MCP-ответов;fullсохраняет их полностью. Журнал и ответы Python API не сокращаются.TC1C_COMPACT_REFS— адресация элементов:id(по умолчанию),prefixилиoff.idработает с TOON и JSON;prefixсокращает адреса только в TOON. Прежниеtrueиfalseпринимаются как синонимыprefixиoff.TC1C_REF_LIMIT— максимум элементов в реестре одного подключения, по умолчанию100000; положительное целое число. Ограничение действует во всех режимах адресации.TC1C_VERIFY_TARGET— проверка существования объекта перед действием,true(по умолчанию) илиfalse.TC1C_READBACK— чтение состояния до и после действия,true(по умолчанию) илиfalse.TC1C_SNAPSHOT_LIMIT— максимум сохранённых состояний форм на сервере, по умолчанию100.TC1C_SNAPSHOT_MEMORY_MB— лимит хранилища состояний в МиБ, по умолчанию128. Лимиты общие для явных снимков и автоматических состоянийget_context(одно на форму). При переполнении вытесняются давно не использовавшиеся снимки.TC1C_SCREENSHOTS— снимки окна 1С,true(по умолчанию) илиfalse. Приfalseдействиеget_screenshotи его параметры не публикуются.TC1C_LOGGING— журнал MCP-вызовов, по умолчаниюtrue; приfalseдействия управления журналом скрыты.TC1C_LOG_AUTO_START— начинать журнал автоматически, по умолчаниюfalse.TC1C_LOG_DIR— каталог журналов на сервере, по умолчаниюlogs.TC1C_LOG_REPORTS— отчёты:html(по умолчанию),allure,html,allureилиnone. JSONL-журнал сохраняется при любом выборе; скриншоты настраиваются отдельно.TC1C_LOG_SCREENSHOTS— разрешить снимки в журнале, по умолчаниюtrue; независимо отTC1C_SCREENSHOTS.TC1C_LOG_MAX_MB— общий лимит журналов в МиБ, по умолчанию1024. Старые завершённые журналы удаляются; если места недостаточно, запись приостанавливается.
Формат ответов
Формат ответов — TOON (компактный, по умолчанию) или JSON.
Выбор: TC1C_RESPONSE_FORMAT.
По умолчанию успешные MCP-ответы сокращены (TC1C_RESPONSE_DETAIL=compact):
в простых действиях не повторяются переданный target и успешная проверка его наличия;
connection_id опускается при единственном подключении. У окна после нажатия или перехода
остаются адрес, название и возможная диагностика. Если описание окна не изменилось,
вместо блока window возвращается window_changed: false; первое или изменившееся
описание приходит с window_changed: true. Сравнение отдельно для каждого подключения;
переподключение сбрасывает запомненное описание.
Ответы подключения сохраняют connection_id. Ошибки и признаки неполных результатов
не сокращаются. full возвращает полные служебные поля; журнал и Python API всегда их сохраняют.
Режим адресации элементов задаётся через TC1C_COMPACT_REFS:
id— короткие ссылкиref, передаваемые в действия без изменений; по умолчанию.prefix— сокращённые адреса со словарями в ответе TOON; в JSON адреса полные.off— полные адресаkeyиhandle.
Инструменты
find_objects по умолчанию возвращает все совпадения. Для больших результатов доступны
limit и продолжение через cursor, без повторного поиска. Примеры — в справочнике.
Сервер публикует 10 инструментов — по типам объектов клиента тестирования; операция выбирается
параметром action, до 160 действий. Список действий с методами 1С, применимыми типами и
параметрами вынесен в отдельный документ:
docs/TOOLS.md.
Дополнительно доступны инструменты без параметра action:
tc_execute_code— выполнение BSL-кода в клиентском или серверном контексте;tc_execute_query— запрос с параметрами, до 500 строк результата (по умолчанию 100);tc_get_metadata— структура конфигурации: объекты, реквизиты, типы, табличные части и перечисления;tc_list_custom_bsl_functionsиtc_execute_custom_bsl_function— описание и вызов пользовательских BSL-функций, зарегистрированных в обработке.
Они работают через внешнюю обработку Testpilot, которую
сервер автоматически открывает при запуске клиента. Произвольный код, запросы и
пользовательские функции включаются независимо; по умолчанию выключены.
TC1C_METADATA=auto включает метаданные вместе с кодом или запросами; true включает
их отдельно, false скрывает. При TC1C_FUNCTIONS=true инструменты функций появляются,
когда подключена обработка с непустым реестром. В Python API те же методы вызываются
без префикса tc_ и работают при запуске клиента с обработкой через code_epf,
независимо от настроек публикации MCP.
Действие get_screenshot в tc_app возвращает изображение окна 1С со всплывающими списками,
не переключая фокус. MCP-сервер и клиент должны работать на одном компьютере:
Windows или Linux с X11/XWayland. На Linux нужен доступ к сеансу клиента через DISPLAY и XAUTHORITY;
захват приложений, работающих напрямую через Wayland, не поддерживается. Свёрнутое окно нужно открыть.
scale задаёт масштаб 25–100%, grid включает координатную сетку, region=[x,y,width,height]
ограничивает область в пикселях исходного снимка. Неполный снимок сопровождается предупреждением.
В сценарий снимки не записываются.
Журнал работы агента
В tc_session: start_logging начинает запись, get_logging_status показывает состояние,
stop_logging завершает её и возвращает пути к JSONL-журналу и выбранным отчётам.
Параметр reports в start_logging переопределяет TC1C_LOG_REPORTS для новой сессии:
["html"], ["allure"], ["html", "allure"] или ["none"] для одного JSONL-журнала.
Параметр screenshot_mode: off — без снимков, actions — после изменений и при ошибках,
all — после каждого вызова. По умолчанию actions, либо off, если снимки журнала запрещены.
PNG сохраняются рядом с отчётом и не добавляются в ответы агенту. Для снимков нужен локальный клиент.
Журнал каждого подключения независим; отключение клиента завершает запись. Повторный start_logging
сохраняет текущий журнал и выбранные настройки. Вызов run_scenario содержит отдельные шаги
с их результатами и скриншотами; одинаковый снимок используется во всех выбранных отчётах.
HTML доступен во время записи. При выборе Allure после завершения сессии в allure-results
появляются результаты и вложения для сборки отчёта Allure. Поле allure_results содержит путь
к ним, report_errors — ошибки формирования отчёта, если они возникли. Для просмотра установите
Allure Report и выполните:
allure generate "logs/session-…/allure-results" -o allure-report
allure open allure-reportВ Allure сессия MCP отображается в группе Testpilot sessions. Её статус описывает ошибки
вызовов и полноту записи; выполнение пользовательской задачи оценивается отдельно.
Для Python-тестов используется интеграция с allure-pytest: шаги относятся к тестам,
а результат определяет pytest. Подробнее — отчёты pytest.
Запись и воспроизведение сценариев
tc_scenario(action="record_start") → выполнить действия → tc_scenario(action="record_finish") возвращает
XML-сценарий (uilog) и lost_actions (действия, не попавшие в сценарий; при непустом списке
сценарий неполный). Воспроизведение — tc_scenario(action="run_scenario", uilog=...).
Ответ по умолчанию краткий: итог, счётчики и последний шаг с ошибкой. Для списка всех шагов
передайте result_mode="full". При включённом логировании журнал сохраняет подробности
в обоих режимах. Это поведение действует также в Python API.
Режим записи — TC1C_RECORD_MODE.
Ограничения
Протокол закрытый и может отличаться между версиями платформы. Локальное подключение проверено на Windows с 8.3.27 и 8.5.1; удалённое — к Windows с 8.3.27 и к Ubuntu с 8.3.27. Способ подключения выбирается автоматически по ответу тест-клиента.
Available Tools
10 toolstc_appA
Application-level state: active window, child objects, errors, dialogs, limits. Also available: tc_field(action="is_visible"), tc_field(action="is_enabled"), tc_field(action="get_context_menu").
marks a required action parameter; the group schema treats action parameters as optional. Pass action="name" and only that action's parameters. Actions:
clear_file_dialog_result() Clear a previously set file-dialog result. (1C 8.3.25+)
get_active_window() Read the active window: ref/class/title/platform_version, optional form_name/url/home_page/is_main. title is the form caption (null: no form or unreadable); url is empty without a link. form_name is a metadata name, not the form's GUID name; it is only attempted when the window supplies no caption and may remain absent; absence says nothing about the form. Read it explicitly with tc_app(action="get_child_objects") on the window ref. platform_version identifies this connection; unsupported actions report available_since. addressable=false means no element address, not a window type. native=true with recovery=close_window indicates a local preview to close before addressing form elements. active_window_unavailable gives recovery guidance; no_active_work_window requires opening a form with tc_window(action="execute_command"). (1C 8.3.3+)
get_child_objects(ref=null, scope='window') Read one level: parent and children: [...], with class/title and optional name/type/form_name. type is the platform element kind (null if unknown); ManagedForm.form_name is its metadata name. Omitted parent uses the last observed active window, querying it if none was observed. scope=application without a parent lists application windows. Windows/command buttons may include url; windows may include home_page/is_main. Address the parent with ref; children contain ref values. For a whole subtree, pass root_ref to tc_find(action="find_objects"). (1C 8.3.3+)
get_current_error() Get info about the session's last CLIENT error (none → null). error is the main description; details preserves additional text, including nested causes, module locations and stacks. Application messages (e.g. unfilled fields or posting refusal) are read with tc_window(action="get_user_message_texts"); they may include earlier actions. (1C 8.3.3+)
get_max_action_time() Get the max action-execution time in seconds (set via tc_app(action="set_max_action_time"); None if unset).
get_parent(ref*) Get an element's parent in parent: [...]. The server resolves the parent's own address and returns it with the available object metadata. Address the element with ref; objects in parent contain their own ref values. (1C 8.3.24+)
get_performance(clear=False) Get accumulated session performance counters (calls, duration, sent, received). Set clear to also reset them, so the next read measures only what happened after this call. (1C 8.3.6+)
get_screenshot(scale=100, grid=False, region=null) Capture the connected 1C window with popups as an image, without changing focus. Requires a local client on Windows or Linux with X11/XWayland and desktop access. scale: 25..100 percent. Optional region=[x,y,width,height] uses original screenshot pixels; grid labels those coordinates. capture_complete=false means some popups are missing. Screenshots are not recorded in scenarios.
set_file_dialog_result(result=True, filename=null, filter_index=0) Predefine the NEXT file dialog: result=true with filename (or a list for multiple files) selects; false cancels. filter_index is 0-based. Call BEFORE opening; cannot answer an open dialog. Each answer is consumed once. On 8.3.25+, replaces pending answers; clear_file_dialog_result clears unused ones. Older platforms cannot clear them: prepare only the next dialog. (1C 8.3.8+)
set_max_action_time(seconds*) Set the max action-execution time in seconds: how long a result-returning action may take before the call gives up (0 = wait indefinitely). Stored on the client (no network call) and applied to every subsequent command. ref selects the client; otherwise set connection_id when several clients are connected. Use tc_session(action="list_connections"). Success may omit target/connection echoes and shorten window details. Use returned references unchanged in ref; re-find expired elements.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | ||
| grid | No | ||
| clear | No | ||
| scale | No | ||
| scope | No | ||
| action | Yes | ||
| region | No | ||
| result | No | ||
| seconds | No | ||
| filename | No | ||
| filter_index | No | ||
| connection_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does surprisingly well: it discloses platform prerequisites for get_screenshot (local client, Windows or Linux with X11/XWayland, desktop access), that capture_complete=false means popups are missing, that file-dialog answers are consumed once and cannot clear pre-8.3.25, that set_max_action_time is stored client-side with no network call, and that success responses may omit target/connection echoes. It still omits mutation risk details for clear_file_dialog_result beyond 'clears unused ones'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The structure is front-loaded (scope line, sibling pointers, the action=name convention) followed by a scannable per-action list, which is the right shape for a 10-action dispatcher. Some action entries, notably get_active_window, pack in dense parenthetical clauses that slow reading, but none are filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-annotation, no-output-schema, 10-action tool, the description covers per-action behavior, return fields (ref/class/title/platform_version, parent/children structure, error/details), version gates (1C 8.3.3+ through 8.3.25+), and error-recovery hints. Nothing an agent needs to pick and invoke an action correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% with 12 parameters, so the description must compensate and largely does: ref is explained in get_child_objects/get_parent/set_max_action_time, scope='application' behavior is spelled out, scale is bounded (25..100), region is defined in original screenshot pixels, grid labels those coordinates, clear resets counters, filter_index is 0-based, and connection_id is tied to tc_session(action="list_connections"). A few parameters (seconds beyond 'max action-execution time', result defaults) are only lightly contextualized, so not a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening line scopes the tool ('Application-level state: active window, child objects, errors, dialogs, limits') and each of the 10 actions carries a specific verb+resource, so an agent can see exactly which operations this dispatcher owns. It also names sibling tools it is not (tc_field for is_visible/is_enabled/get_context_menu, tc_window for get_user_message_texts, tc_find for subtrees), giving real differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Routing is explicit in several places: application messages are read with tc_window(action="get_user_message_texts"), no_active_work_window requires tc_window(action="execute_command"), and a whole subtree needs tc_find(action="find_objects"). Per-action timing rules ('Call BEFORE opening; cannot answer an open dialog') give clear context. There is no single consolidated when-to-use/when-not statement for the tool as a whole, so it stops 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.
tc_calendarA
Actions on a calendar field. Also available: tc_field(action="is_visible"), tc_field(action="is_enabled"), tc_field(action="get_context_menu"), tc_app(action="get_parent").
marks a required action parameter; the group schema treats action parameters as optional. Pass action="name" and only that action's parameters. ok=true means accepted; verify effects by reading state. target_check: present, unknown (uncheckable), off (disabled); present does not prove an effect. target_hidden=true means the target exists but is invisible; it describes the element, not its ancestors. Its absence says nothing; hidden targets may still act (e.g. activate). Invalid addresses are rejected only where the address can be checked; an unverified empty read may mean a missing target. failure_context describes state/editor/choices; its complete=false means incomplete diagnostics. Actions:
calendar_next_month(ref*) Move a calendar field to the next month. The command is accepted, but nothing readable about the field changes, so this cannot be verified. To move the date use tc_calendar(action="goto_date").
calendar_next_year(ref*) Move a calendar field to the next year. The command is accepted, but nothing readable about the field changes, so this cannot be verified. To move the date use tc_calendar(action="goto_date").
calendar_previous_month(ref*) Move a calendar field to the previous month. The command is accepted, but nothing readable about the field changes, so this cannot be verified. To move the date use tc_calendar(action="goto_date").
calendar_previous_year(ref*) Move a calendar field to the previous year. The command is accepted, but nothing readable about the field changes, so this cannot be verified. To move the date use tc_calendar(action="goto_date").
goto_date(ref*, year*, month*, day*) Go to a date (year, month, day) in a calendar field. Returns changed/value_before/value_after. ref selects the client; otherwise set connection_id when several clients are connected. Use tc_session(action="list_connections"). Success may omit target/connection echoes and shorten window details. Use returned references unchanged in ref; re-find expired elements.
| Name | Required | Description | Default |
|---|---|---|---|
| day | No | ||
| ref | No | ||
| year | No | ||
| month | No | ||
| action | Yes | ||
| connection_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full burden and does so well: it explains that ok=true only means accepted and effects must be verified by reading state, that several nav actions are unverifiable because nothing readable changes, and it defines target_check, target_hidden, failure_context and the meaning of empty reads. This is exactly the behavioral context an agent needs for a mutation tool and goes well 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and action list are front-loaded, but the shared verification preamble is dense and the phrase "The command is accepted, but nothing readable about the field changes, so this cannot be verified" is repeated verbatim across four actions. That repetition consumes space without adding per-action information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex, unannotated mutation tool with no output schema, the description covers the important unknowns: verification limits, target/connection echo behavior, address-validation caveats, and failure_context semantics. Ref re-use and expiry guidance are also present, leaving only small edge cases unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 6 parameters, so the description must compensate, and it largely does: ref is defined as the client selector with connection_id as the fallback, and year/month/day are tied to the goto_date action with expected return fields. Minor gaps remain, such as month numbering and the meaning of default-null dates, but the critical parameters are covered.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (a calendar field) and enumerates every action with a concrete verb and effect (move to next month/year, go to a date). It also distinguishes itself from siblings by routing element-level checks to tc_field and parent traversal to tc_app, so an agent can tell it apart 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is explicitly routed: for date movement use tc_calendar(action="goto_date") rather than the month/year nav actions, and ref/connection_id selection is described with a pointer to tc_session(action="list_connections"). Alternative sibling tools (tc_field, tc_app) are named with the exact actions they cover.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tc_docA
Actions on document fields and spreadsheet areas. Choose action.
Also available: tc_field(action="is_visible"), tc_field(action="is_enabled"), tc_field(action="get_context_menu"), tc_app(action="get_parent").
marks a required action parameter; the group schema treats action parameters as optional. Pass action="name" and only that action's parameters. ok=true means accepted; verify effects by reading state. target_check: present, unknown (uncheckable), off (disabled); present does not prove an effect. target_hidden=true means the target exists but is invisible; it describes the element, not its ancestors. Its absence says nothing; hidden targets may still act (e.g. activate). Invalid addresses are rejected only where the address can be checked; an unverified empty read may mean a missing target. failure_context describes state/editor/choices; its complete=false means incomplete diagnostics. Actions:
begin_edit_current_area(ref*) Start editing the current spreadsheet area; follow with input_text and end_edit_current_area. In view mode this can instead open a drill-down menu, object or field chooser. A menu may leave the active window unchanged; use execute_choice_from_menu to continue.
click_formatted_doc_hyperlink(ref*, index*) Click a hyperlink in a formatted-document field by 0-based index (or by its text). On a document without links the platform answers the same and puts up its own error window, and tc_doc(action="get_formatted_string_hyperlinks") cannot be used to check first: for a formatted DOCUMENT it answers with an empty list even when the document does have a link (it lists links only for a formatted-string label). Judge by what the click was supposed to do. (1C 8.3.25+)
click_formatted_string_hyperlink(ref*, index*) Click a hyperlink in a formatted string by 0-based index (or by its text). ref may be a label field or a form decoration bearing the formatted string. (1C 8.3.13+)
click_html_hyperlink(ref*, index*) Click an HTML link. The platform may open the FIRST link regardless of an in-range index; out-of-range indexes fail. text has no effect. Verify the resulting navigation. (1C 8.3.25+)
end_edit_current_area(ref*, cancel=False) Finish editing the current spreadsheet-document area. Set cancel to discard the edit instead of committing it. Returns the cell address and its text before/after finishing; changed compares those values, including when an edit is cancelled.
find_text(ref*, text*, match='contains', case_sensitive=False, area=null, start_address=null, max_cells=1000) Find literal spreadsheet text (match=contains/exact, case-insensitive by default); return cell addresses/text without moving the current area. area restricts a cell/rectangle (8.3.25+). max_cells=1..10000 limits scanned positions, not matches. If complete=false, resume with start_address=next_address and unchanged text/match/case_sensitive/area. Empty matches proves absence only in the successfully scanned part. (1C 8.3.13+)
get_area_text(ref*, area=null) Get the text of ONE spreadsheet-document area; omit area to read the current one. tc_doc(action="get_current_area_text") is the older form of this same call and answers identically; prefer this one. (1C 8.3.6+)
get_current_area_address(ref*) Get the address of the current spreadsheet-document area.
get_current_area_field(ref*) Get the field of the current spreadsheet-document area. (1C 8.3.2+)
get_current_area_text(ref*, area=null) Get the text of ONE spreadsheet-document area; omit area to read the current one. This is the older form of tc_doc(action="get_area_text"), which the platform deprecated in 8.3.6 in favour of that one; prefer get_area_text.
get_doc_area_horizontal_size(ref*) Get the horizontal size (max column number holding data) of a spreadsheet-document. (1C 8.3.13+)
get_doc_area_vertical_size(ref*) Get the vertical size (max row number holding data) of a spreadsheet-document. (1C 8.3.13+)
get_formatted_string_hyperlinks(ref*) Get a formatted string's hyperlink presentations. (1C 8.3.25+)
get_html(ref*) Read the HTML of a formatted/HTML-document field. After the form has put up a menu or a modal choice list, the platform stops returning this field's content until it is written again — an empty answer right after such a window does not mean the field is empty. (1C 8.3.8+)
included_in_merged_area(ref*, address*) Return the address of the merged area containing the cell (e.g. 'R1C1'), or None if the cell is not part of a merged area. A null answer is ambiguous in one more way: it also comes back when the document has no such cell or no area by that name — the platform does not distinguish the two, and neither can this action. Only the FORM of the address is checked here (cell, range, area name, intersection); whether it exists is up to the document. (1C 8.3.25+)
input_html(ref*, html*, attachments=null) Set HTML/text into a formatted-document field. attachments maps an image name used in the HTML (e.g. -> "p1") to that image as a base64 string; src must exactly match the attachment name. Names must be identifiers (no dots). (1C 8.3.8+)
read_document(ref*, start_address=null, max_cells=1000, area=null) Read nonempty spreadsheet cells as rows with cell addresses and merged-cell spans. Optional area is a rectangle such as R2C3:R8C5 (platform 8.3.25+), clipped to the document's data bounds. Intersecting merged cells retain their full address/span, even if they start outside area. If complete=false, pass next_address as start_address with the same area to continue. max_cells limits positions scanned per call (1–10000). Does not move the current area.
set_area_text(ref*, address*, text*) Set a spreadsheet cell's text by address, e.g. R2C1. Selects the cell, starts and finishes editing, then reads the result. Empty text clears it. Returns verified, changed and value_before/value_after. Numeric formatting can return verified=null with verification=numeric_equivalent. Rounded output returns value_verification_inconclusive: editing finished, but the exact value is not verified. Requires an editable document.
set_current_area(ref*, address*) Set the current area of a spreadsheet-document field (e.g. 'R1C1').
text_within_area_bounds(ref*, area=null) Whether the text in a spreadsheet-document area fits within its bounds (True) or is clipped to '#####' (False). Pass area (e.g. 'R1C1'); omit to check the current cell. (1C 8.3.25+)
write_content_to_file(ref*, filename=null, file_format=null, filter_index=null, save_as=null) Save HTML/formatted/spreadsheet/text fields (not PDF fields). filename forces Save As, replacing and finally clearing pending dialog answers on 8.3.25+; older versions cannot clear unused answers, so prepare only the next dialog. Spreadsheet file_format: mxl/html/pdf/xls/xlsx/ods/docx; extension alone does not select it. Alternatively use 0-based filter_index; mutually exclusive with file_format, omitted: first type. Without filename, use current name unless save_as=true; predefine possible dialogs before EACH call with tc_app(action="set_file_dialog_result"). ok confirms accepted requests, not completed disk writing. Final cleanup failure separately returns cleanup_error and dialog_answer_cleared=false; the next filename call retries cleanup before saving. (1C 8.3.8+) ref selects the client; otherwise set connection_id when several clients are connected. Use tc_session(action="list_connections"). Success may omit target/connection echoes and shorten window details. Use returned references unchanged in ref; re-find expired elements.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | ||
| area | No | ||
| html | No | ||
| text | No | ||
| index | No | ||
| match | No | ||
| action | Yes | ||
| cancel | No | ||
| address | No | ||
| save_as | No | ||
| filename | No | ||
| max_cells | No | ||
| attachments | No | ||
| file_format | No | ||
| filter_index | No | ||
| connection_id | No | ||
| start_address | No | ||
| case_sensitive | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden and does so extensively. It discloses verification semantics for ok=true, target_check states, target_hidden behavior, incomplete failure_context, invalid-address checking limits, and action-specific caveats for hyperlink clicks, edits, document reads, and file saving.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long and dense, but the tool supports 21 actions with many platform-specific caveats, so much of the length is earned. Structure is front-loaded with purpose and global rules before the action list, though some verbosity could be trimmed without losing essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations, no output schema, 18 parameters, and 21 actions, the description is remarkably complete. It documents mutation behavior, return values for several actions, continuation semantics, deprecation alternatives, and error/verification caveats that an agent would otherwise have to guess.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for 18 parameters. It explains each parameter in context: ref, area, html, text, index, match, action, cancel, address, save_as, filename, max_cells, attachments, file_format, filter_index, connection_id, start_address, and case_sensitive all receive concrete meaning, examples, or constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb+resource domain: actions on document fields and spreadsheet areas, with a dispatcher action parameter. It lists all supported actions, so the agent knows exactly what the tool can do, though it does not sharply distinguish the umbrella boundary from siblings such as tc_field and tc_table.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives per-action guidance such as following begin_edit_current_area with input_text and end_edit_current_area, preferring get_area_text over the deprecated get_current_area_text, and using tc_session to list connections. It also notes sibling alternatives like tc_field and tc_app actions. However, there is no explicit general rule for when to choose tc_doc over siblings such as tc_field or tc_table, so usage guidance remains implied rather than decisive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tc_fieldA
Actions on a form field, button, group or element addition. Choose action.
Also available: tc_app(action="get_parent").
marks a required action parameter; the group schema treats action parameters as optional. Pass action="name" and only that action's parameters. ok=true means accepted; verify effects by reading state. target_check: present, unknown (uncheckable), off (disabled); present does not prove an effect. target_hidden=true means the target exists but is invisible; it describes the element, not its ancestors. Its absence says nothing; hidden targets may still act (e.g. activate). Invalid addresses are rejected only where the address can be checked; an unverified empty read may mean a missing target. failure_context describes state/editor/choices; its complete=false means incomplete diagnostics. Actions:
activate(ref*) Focus an element, switch a page or make a table column current; click does not do this. Commits pending input_text only by focusing a DIFFERENT focusable element; tc_form(action="goto_next_element") lets the form choose. Reports page visibility; still hidden returns target_hidden. No changed flag: verify via get_text/get_current_page, tc_form(action="get_current_element") or tc_table(action="get_current_item").
cancel_edit(ref*) Cancel editing an input field. (1C 8.3.6+)
choose_from_drop_list(ref*, value*) Pick a value from a field's open drop-down list by its display text (e.g. a colour name) or by its 0-based index in the list. The value is written at once — no focus change is needed. changed may come back null here even when the value did change: with the list open the value cannot be read. A changed window is returned when readback is enabled; inspect it before continuing. window_changed=false reuses the previous window description. Read the field with tc_field(action="get_text") to confirm. (1C 8.3.6+)
clear(ref*) Clear an input field's value.
click(ref*, diagnostics=False, diagnostics_wait=2.0) Click a button, field, group, decoration or command-interface button. Use activate to focus inputs/cells/pages. window, when present, is the active window afterwards. window_changed=false means the previous window description still applies. diagnostics=true also reads messages, possibly from earlier actions. diagnostics_wait=0..60 seconds polls while messages are unavailable/empty; 0 reads once. Individual requests use set_max_action_time. diagnostics.status is read/unavailable/failed; null messages are not an empty list. ok or absent messages do not prove business success.
click_view_status_item(ref*, index*) Click a view-status item by 0-based index (or by its text). Nothing here proves the item was there: the platform answers the same when the form has no view-status line at all, and reading the texts first does not settle it either — that read comes back empty even while a search or filter is active. Judge by the list itself: read the rows before and after. (1C 8.3.16+)
close_drop_list(ref*) Close a field's drop-down list. Verify with tc_field(action="drop_list_is_open"). (1C 8.3.6+)
create(ref*) Create a new object from a reference field: opens the new object's form, as the field's '+' does. The field must have the FOCUS first — call tc_field(action="activate") on it, otherwise the command is accepted and nothing opens. Verify by reading the active window. (1C 8.3.6+)
current_check(ref*) Whether a form BUTTON is pressed, or shows a check mark next to it. Only buttons answer meaningfully: anything else — a checkbox field, a page, a table — always reports false, which means 'not applicable', not 'switched off'. Read a checkbox with tc_field(action="get_text") ('Да'/'Нет') and the active page with tc_field(action="get_current_page"). (1C 8.3.16+)
current_mode_is_edit(ref*) Whether a table row or spreadsheet-document field is currently in edit mode. (1C 8.3.3+)
current_opened(ref*) Whether a form group is currently open. (1C 8.3.16+)
decrease_value(ref*) Decrement a numeric (spinner) field. A track bar does NOT take this — move it with tc_field(action="goto_value") in percent. When the value does not move,
applicable: falsein the answer means the method does not fit this kind of field.delete_view_status_item(ref*, index*) Delete a view-status item by 0-based index (or by its text) — this is how a filter or a search chip is dropped. Nothing here proves the item was there: the platform answers the same when the form has no view-status line, and reading the texts first does not settle it either. Judge by the list itself: read the rows before and after. (1C 8.3.16+)
drop_list_is_open(ref*) Whether a field's drop-down list is open. (1C 8.3.6+)
execute_choice_from_choice_list(ref*, value*) Pick from a field's choice list by its display text or by its 0-based index. Reports changed/value_before/value_after — the field's value read before and after, same as tc_field(action="choose_from_drop_list"). A changed window is returned with readback enabled. window_changed=false reuses the previous window description.
get_choice_list(ref*) Read radio-button options, an input's open drop-down list or a form's open choice list. For an input, open its list immediately before reading: the answer describes whichever drop-down is currently open. items contains {presentation, text}; presentations contains the displayed texts to select. A closed input list may return items=[] with status=unknown. (1C 8.3.12+)
get_command_bar(ref*) Get an element's own command panel object, if it has one. This is NOT the list of buttons: the panel is a container, and its buttons are read with a separate tc_app(action="get_child_objects") on the returned ref. An empty result means the element has no command panel of its own — a list table is the usual case, its buttons live in a form group next to it. (1C 8.3.3+)
get_context_menu(ref*) Get an element's context menu. The platform returns the menu as a form GROUP, not as a list of commands: 'menu' holds that group, and its items are read with a separate tc_app(action="get_child_objects") on the group's ref. (1C 8.3.3+)
get_current_page(ref*) Get the current page of a page group. To switch pages use tc_field(action="activate"): a click on a page does not switch to it. tc_field(action="current_check") is useless here — pages always report checked=false. (1C 8.3.6+)
get_data_presentation(ref*) Get an element's data presentation. Form fields only — not form decorations, and on a table the answer is always null. An empty input or label field returns "". presentation is null when no value was available; that is not proof that the field has no presentation.
get_edit_text(ref*) Read an input field's edit buffer — what is being typed, which is not necessarily what the form holds. get_data_presentation reads the accepted value; get_text reads displayed text. An empty input buffer returns ""; null means unavailable. (1C 8.3.3+)
get_linked_window(ref*) Get the linked window of a command-interface button. An empty answer means the button has no linked window — but only when
target_checksays the button itself is there; a wrong ref answers empty too, and the check is what tells the two apart. (1C 8.3.6+)get_state_presentation(ref*) Read a form field's state presentation. An unavailable value is explained in the answer; null does not confirm that the field has no state presentation. (1C 8.3.16+)
get_text(ref*) Read displayed text (checkbox text follows the client language). An empty input or label field returns "". For an edit buffer use get_edit_text. If text is unavailable, the answer explains the limitation and suggests another reading action where applicable. null does not confirm an empty field. (1C 8.3.12+)
get_tooltip(ref*) Read an element's tooltip text (empty → None). (1C 8.3.3+)
get_view_status_item_texts(ref*) Get the view-status item texts of a form-element addition → list of strings. Do not use it to tell whether a filter or search is active: with a list narrowed down to one row by search the platform still answers with an empty collection. Check the effect by reading the rows. (1C 8.3.16+)
goto_value(ref*, percent*) Move a TRACK BAR to a value in PERCENT (0..100). This is a track bar method: on any other kind of field the command is accepted and nothing moves, and the answer then carries
applicable: false. A spinner is stepped with increase_value/decrease_value instead. Returns changed/value_before/value_after. (1C 8.3.6+)increase_value(ref*) Increment a numeric (spinner) field. A track bar does NOT take this — move it with tc_field(action="goto_value") in percent. When the value does not move,
applicable: falsein the answer means the method does not fit this kind of field.input_text(ref*, text*, finish=True) Enter text; text="" clears. finish=true moves the owning form's focus once and verifies ordinary input; false keeps the edit buffer (e.g. for reference choice/cancel). Reference input may still require selection. Changed pending text causes pending_input_changed: re-enter or cancel. committed=true/false/null means accepted/pending/unverified; edit_finished means focus left; changed compares displayed text. Numeric formatting may yield verification=numeric_equivalent and committed=null. These flags do not confirm saving. For table cells use tc_table(action="set_cell_text"); finish text documents with activate on another element, spreadsheet cells with tc_doc end_edit_current_area.
is_enabled(ref*) Read the element's availability. A command can still refuse execution in the current form state. (1C 8.3.3+)
is_readonly(ref*) Whether an element is currently read-only — that is the element's own read-only property. Two other things look the same and are NOT this: an element switched off entirely (read that with tc_field(action="is_enabled")), and a spreadsheet-document field shown in view mode, which neither read reflects — there, tc_doc(action="begin_edit_current_area") runs the cell's details instead of editing. (1C 8.3.3+)
is_visible(ref*) Whether an element is currently visible. Returns an error instead of visible=false when there is no object at ref: for this read the protocol does report a missing target, so a mistyped address cannot pass for a hidden element. On the pages of a page group this does NOT tell you which page is on screen — several pages report visible=true at once; use tc_field(action="get_current_page") for that. (1C 8.3.3+)
open_drop_list(ref*) Open the drop-down list of a reference/enum field (call before choose_from_drop_list). (1C 8.3.6+)
open_field(ref*) Open a reference field's value (F4 / follow the link).
read_fields(targets*, properties=null) Read 1–100 fields of the active form without moving focus. properties defaults to ['text']; presentation reads data, edit_text reads the editing buffer. visible/enabled/readonly are optional. Table-column text reads the current row. Results follow input order (index is 0-based); unavailable properties remain null with a reason. Reads are sequential, not an atomic snapshot. targets is an array of {ref} objects returned by discovery. (1C 8.3.12+)
select_option(ref*, value*) Pick a radio-button option by its display text or by its 0-based index.
select_value(ref*, value=null, match=null, choice_table=null, choice_column=null, data_type=null, expected=null, max_rows=500, timeout=180) Select exact value text (drop-down first) or match={column title: exact text} in a choice form. Ambiguous/incomplete searches refuse selection. choice_table is an exact table name; choice_column limits value to a column title; data_type chooses a displayed type in the standard type dialog. expected checks accepted field text. Returns accepted value and verification. max_rows=1..10000; timeout is in seconds, 0<timeout<=3600, and covers the action. Failure leaves the UI and does not undo sent choices. Table cells use the current row and leave row editing open. (1C 8.3.12+)
set_check(ref*) Toggle a checkbox field. Inside a table this acts on the column that is the CURRENT cell, so make the target column current first — tc_field(action="activate") on the column element does that; a click on the cell does not.
set_fields(entries*) Fill 1..100 input fields or checkboxes in one active form, in order. Each entry has exactly one of text, checked (boolean), or select={value: exact text} / select={match: {column title: exact text}}; select accepts tc_field(action="select_value") options. Empty text clears; matching checkboxes are not toggled, unknown states stop (Russian/English Yes/No supported). Stops on refusal, pending choice, window change or unconfirmed value; earlier changes remain. Rechecks all values at the end; final_verified=null may mean equivalent numeric formatting. Results use 0-based input indexes. Does not save the document. entries contains {ref, text}, {ref, checked}, or {ref, select} objects; use discovered references unchanged. (1C 8.3.12+)
start_choosing(ref*) Open a reference field's choice form. Handles focus and table-cell editing. For CalendarField, selects the current date like a double-click; use goto_date first. Returns opened and the active window. A calendar selection need not open another window.
start_choosing_from_choice_list(ref*) Start choosing from a field's choice list.
title_is_shown(ref*) Whether an element's title is shown. (1C 8.3.25+)
wait_for_drop_list_generation(ref*, timeout=60) Wait timeout seconds (integer 0..65535) for a generated drop-down; returns generated. The result is not tied to ref and may be true before this field's list opens. Open this field's list first, then read it immediately. (1C 8.3.4+) ref selects the client; otherwise set connection_id when several clients are connected. targets/entries references also select it; all must belong to one connection. Use tc_session(action="list_connections"). Success may omit target/connection echoes and shorten window details. Use returned references unchanged in ref; re-find expired elements.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | ||
| text | No | ||
| index | No | ||
| match | No | ||
| value | No | ||
| action | Yes | ||
| finish | No | ||
| entries | No | ||
| percent | No | ||
| targets | No | ||
| timeout | No | ||
| expected | No | ||
| max_rows | No | ||
| data_type | No | ||
| properties | No | ||
| diagnostics | No | ||
| choice_table | No | ||
| choice_column | No | ||
| connection_id | No | ||
| diagnostics_wait | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and discharges it: ok=true means accepted but not verified, target_check present/unknown/off, target_hidden describes the element not ancestors, invalid addresses are only rejected where checkable, failure_context.complete=false means partial diagnostics, and per-action caveats (click_view_status_item cannot prove the item existed; get_linked_window empty is ambiguous). This is unusually rich behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is long, but the length is largely justified by 43 actions with distinct caveats. The structure is front-loaded (global rules, target_check semantics, then the action list) and each action entry is tight. A few caveats are repeated across related actions (e.g. the view-status 'nothing proves the item was there' text), which is minor redundancy rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 43-action, 20-parameter tool with no output schema and no annotations, the description supplies the return-value semantics (changed, committed, verification, target_check, failure_context, window_changed) that would otherwise be missing. Nothing an agent needs to invoke a chosen action correctly appears absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and there are 20 parameters, so the description must compensate, and it does: ref selects the client / must come from discovery, targets is {ref} objects from discovery, entries accepts text/checked/select shapes, properties defaults to ['text'] with enumerated alternatives, percent is 0..100, timeout bounds, max_rows bounds, finish semantics, and per-action required/optional parameter rules ('Pass action="name" and only that action's parameters').
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific resource ('form field, button, group or element addition') and the dispatch mechanism ('Choose `action`'). It repeatedly differentiates from siblings (table cells → tc_table, form-level focus → tc_form, child objects → tc_app). It is broad because the tool multiplexes ~43 actions, so a single crisp purpose statement is hard, but it is far from tautological.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Almost every action carries explicit when-to-use/when-not guidance: activate vs click ('click does not do this'), get_text vs get_edit_text vs get_data_presentation, goto_value vs increase/decrease_value, start_choosing vs select_value vs execute_choice_from_choice_list, and routing rules (reference-table cells use tc_table set_cell_text). Alternatives are named with the condition that selects them, which is exactly the standard for a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tc_findA
Search the UI tree for objects.
marks a required action parameter; the group schema treats action parameters as optional. Pass action="name" and only that action's parameters. Actions:
find_object(name=null, cls=null, type=null, root_ref=null, title=null, timeout=0, scope='window') Find the first object matching the criteria (parameters as in tc_find(action="find_objects")). When nothing matched, the answer carries the same filter diagnostics as tc_find(action="find_objects"). (1C 8.3.3+)
find_objects(name=null, cls=null, type=null, root_ref=null, title=null, timeout=0, scope='window', limit=null, cursor=null) Search UI objects: name/title support * ?; cls/type use discovered class/platform kind (tc_app(action="get_child_objects")). root_ref defaults to active window; scope=application requires omitting it. timeout retries while no matches (0: once). Empty results are ok; cls/type diagnostics identify unknown filters and list observed kinds. Windows/command buttons include url when available. No limit returns all; limit=1..1000 pages with total/has_more/next_cursor. Continue with cursor alone (plus connection_id if needed), no filters. Pages retain the original result for 5 minutes; elements may become stale. (1C 8.3.3+)
wait_for_object_displayed(name=null, cls=null, type=null, title=null, timeout=60) Poll the UI tree until an object matching the criteria appears, up to timeout seconds. Returns the object, or ok=False on timeout. Criteria as in tc_find(action="find_objects"). On timeout the answer says whether a
clswas seen at all and lists the classes that were actually present, so a misspelled class name is distinguishable from an object that never appeared. (1C 8.3.3+) root_ref selects the client; otherwise set connection_id when several clients are connected. Use tc_session(action="list_connections"). Success may omit target/connection echoes and shorten window details. Use returned references unchanged in root_ref; re-find expired elements.
| Name | Required | Description | Default |
|---|---|---|---|
| cls | No | ||
| name | No | ||
| type | No | ||
| limit | No | ||
| scope | No | ||
| title | No | ||
| action | Yes | ||
| cursor | No | ||
| timeout | No | ||
| root_ref | No | ||
| connection_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: timeout retry semantics (0: once), empty-result behavior, pagination retention window (pages kept 5 minutes, elements may go stale), and that success may omit target/connection echoes. It also explains the diagnostic payload on cls/type misses and on wait timeouts.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded one-line summary followed by clean per-action bullets, so structure is strong. It is somewhat long and repetitive (the "(1C 8.3.3+)" markers and repeated "Criteria as in tc_find(action='find_objects')" add bulk without information).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 3-action, 11-parameter tool with no annotations and no output schema, the description covers filters, paging, staleness, and key return fields (total/has_more/next_cursor, ok=False). A few return details (full object payload shape) remain implicit, but the essentials for correct invocation are present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it effectively documents all 11 parameters: wildcard support on name/title, cls/type as discovered kinds, root_ref default to active window and reuse-unchanged guidance, scope enum behavior, limit paging range 1..1000, cursor continuation, connection_id disambiguation, and timeout retry semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Search the UI tree for objects") and then enumerates the three distinct actions with their individual semantics. The sibling tools (tc_table, tc_session, tc_app, etc.) are unrelated domains, so no sibling overlap ambiguity remains; an agent can tell exactly what this tool searches.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes between actions: find_object returns the first match, find_objects pages results, wait_for_object_displayed polls. It also states the required-action convention ("Pass action=name and only that action's parameters"), cursor continuation rules, and that scope=application requires omitting root_ref.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tc_formA
Actions on the managed form itself, including navigation between form elements and reading the focused element. Choose action.
Also available: tc_field(action="is_visible"), tc_field(action="is_enabled"), tc_field(action="get_context_menu"), tc_app(action="get_parent").
marks a required action parameter; the group schema treats action parameters as optional. Pass action="name" and only that action's parameters. ok=true means accepted; verify effects by reading state. target_check: present, unknown (uncheckable), off (disabled); present does not prove an effect. target_hidden=true means the target exists but is invisible; it describes the element, not its ancestors. Its absence says nothing; hidden targets may still act (e.g. activate). Invalid addresses are rejected only where the address can be checked; an unverified empty read may mean a missing target. failure_context describes state/editor/choices; its complete=false means incomplete diagnostics. Actions:
compare_snapshot(snapshot_id*, ref=null) Compare the original form instance with its baseline; optional ref must identify the same instance. Returns changes/added/removed; observed means previously unread properties, not changes. complete/baseline_complete/errors mark read gaps. Uses baseline table settings; table_changes matches 1-based row positions and column titles, *_present distinguishes missing/empty cells. Tables are prepared before reading and stay selected; truncated tables are not compared. Added flags: '-' unread, 'unknown' failed. Stores no new snapshot; closed/reconnected forms need a new baseline. (1C 8.3.3+)
create_snapshot(ref=null, include_tables=False, max_rows=500) Save ManagedForm state (default active) for later compare_snapshot; returns snapshot_id/summary. Reads visibility/availability/read-only and ordinary values; hidden branches skip further reads, disabled elements skip read-only. include_tables adds display-ordered rows up to max_rows each without expanding trees; requires active form/finished input (8.3.6+). Tables requiring sequential navigation report table_requires_sequential_read and complete=false; use read_rows separately. Rows stay selected; 8.3 may activate/establish current rows. Preparation precedes final reading. Excludes document contents; sequential, not atomic; may take seconds. (1C 8.3.3+)
current_modified(ref*) Whether a form has been modified. (1C 8.3.3+)
delete_snapshot(snapshot_id*) Delete a saved snapshot belonging to this connection.
execute_choice_from_list(ref*, index*) Pick an item from a modal choice list by 0-based index or display text. Not a field's drop-down (use tc_field(action="choose_from_drop_list")). ref: the form (ManagedForm), not a field. (1C 8.3.8+)
execute_choice_from_menu(ref*, index*) Choose an item from an open menu by 0-based index or display text. For a submenu, call again to choose its item. Address the form or the spreadsheet field that opened the menu. A spreadsheet field requires platform 8.3.25 or newer. (1C 8.3.8+)
find_default_button(ref*) Find the form's default button. ref is the form's ref. (1C 8.3.3+)
get_context(ref=null, save_as_snapshot=False, include_tables=False, max_rows=500, root_ref=null, visible_only=False, include_commands=True, result_mode='changes') Inspect ManagedForm elements (including hidden), state, values and input context; includes discovery, so no separate search is needed. Use tc_find(action="find_objects") alone for element lookup. May take seconds. result_mode=changes returns a full first read, then only new/changed elements and removed objects since the previous complete read of this form; changed=false means no changes. Other interaction fields describe the current state. full returns everything. result_mode and full_reason identify the actual response; context_id/compared_to identify automatic baselines. Filter changes or lost baselines return full. Incomplete reads return full and keep the prior baseline. save_as_snapshot creates a separate fixed snapshot for compare_snapshot without another read. include_tables adds up to max_rows per table without expanding trees; rows stay selected, 8.3 may activate rows. Excludes document contents. Flags: '-' unread, 'unknown' failed, null unavailable (not empty). form_details reports optional hints/type restrictions/choices availability. root_ref limits output to a subtree; include_commands=false omits buttons/command groups; visible_only excludes known hidden/inactive pages, retains unknown visibility. Output filters do not narrow reading or fixed snapshot scope. complete/errors mark read gaps; snapshot_error marks failed saving. Sequential reads. (1C 8.3.3+)
get_current_element(ref*) Get the managed form's focused element as item: [{ref}]. ref: the form (ManagedForm). The platform can return no current element after navigating out of its fields.
goto_next_element(ref*) Move focus to the next element in the managed form's tab order. ref: the form (ManagedForm). This can finish the current field's pending input; read the field's data presentation to verify acceptance. Reference fields may still require choosing a value.
goto_previous_element(ref*) Move focus to the previous element in the managed form's tab order. ref: the form (ManagedForm). This can finish the current field's pending input; read the field's data presentation to verify acceptance.
list_snapshots(ref=null) List saved snapshots for this connection, optionally restricted to one ManagedForm ref. Returns IDs, form titles, timestamps, element counts, sizes and global storage limits. Listing does not refresh last_used_at or verify forms are still open; a supplied ref is validated.
wait_for_closing(window_title=null, timeout=60) Wait until a window closes, up to timeout seconds. Without window_title, watch the window active AT THE MOMENT OF THE CALL. After a close, pass window_title to check the closed window. Switching windows or opening a preview does not count as closing. If the target cannot be identified or its absence confirmed, return ok=False. (1C 8.3.3+) ref/root_ref selects the client; otherwise set connection_id when several clients are connected. Use tc_session(action="list_connections"). Success may omit target/connection echoes and shorten window details. Use returned references unchanged in ref/root_ref; re-find expired elements.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | ||
| index | No | ||
| action | Yes | ||
| timeout | No | ||
| max_rows | No | ||
| root_ref | No | ||
| result_mode | No | ||
| snapshot_id | No | ||
| visible_only | No | ||
| window_title | No | ||
| connection_id | No | ||
| include_tables | No | ||
| include_commands | No | ||
| save_as_snapshot | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so extensively: it explains ok=true semantics and the need to verify effects, target_check states (present/unknown/off), target_hidden meaning, failure_context and complete=false diagnostics, incomplete-read fallback to full with retained baselines, sequential/non-atomic snapshots that 'may take seconds', version gating (1C 8.3.3+/8.3.6+/8.3.25), and that snapshots store no new data on compare. This is unusually thorough disclosure of edge cases and side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but front-loads the purpose and organizes per-action detail into scannable bullets, with a shared caveat block before the action list. Some table-reading and snapshot caveats are restated across actions, and the density is high, so it is efficient but not maximally tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema and no annotations, so the description must cover inputs and returns, and it describes return shapes for most actions (changes/added/removed, snapshot_id/summary, item:[{ref}], ID/title/timestamp listings). Given 14 parameters and 13 actions it is close to complete, with only a few actions (delete_snapshot, current_modified) lightly specified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it largely does: it defines ref/root_ref ('ref: the form (ManagedForm), not a field'), result_mode=changes vs full and the meaning of changed=false, include_tables/max_rows row semantics, save_as_snapshot, visible_only, include_commands, index (0-based), window_title, timeout, and connection_id. Only minor gaps remain (e.g., default resolution for ref when null).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening line states a clear verb+resource ('Actions on the managed form itself, including navigation... and reading the focused element') and the per-action bullets make each sub-operation unambiguous. It also names siblings it is not (tc_field for drop-downs, tc_find for element lookup), aiding discrimination. It stops short of a 5 only because the top-level scope is a broad action bundle rather than a single crisp purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Routing guidance is present and specific in several places: 'Not a field's drop-down (use tc_field(action="choose_from_drop_list"))', 'Use tc_find(action="find_objects") alone for element lookup', and the 'Also available' list. However there is no overall statement of when tc_form is the right entry point versus the other sibling families, so it falls short of explicit when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tc_scenarioA
Record and replay UI scenarios.
marks a required action parameter; the group schema treats action parameters as optional. Pass action="name" and only that action's parameters. Actions:
record_cancel() Cancel user-actions recording (discard the scenario). (1C 8.3.2+)
record_finish(path=null) Stop recording; return XML in uilog or save path (relative to SERVER working directory; returns absolute). Write failure returns ok=false/error/path AND uilog; recording already stopped, so retry cannot recover it. Synth completion failure returns finish_not_confirmed with preserved XML. lost_actions means incomplete replay. no_effect lists unchanged readbacks by CALL index, not XML step; not proof of no effect. observed/not_observed count successful/unavailable readbacks; readback/scope describe coverage. Empty no_effect with observed=0 means nothing checked. (1C 8.3.2+)
record_pause() Pause user-actions recording: actions performed until tc_scenario(action="record_resume") stay out of the scenario. (1C 8.3.2+)
record_resume() Resume user-actions recording. (1C 8.3.2+)
record_start() Start recording a scenario (uilog) that tc_scenario(action="run_scenario") can replay later. Perform the real, effect-producing actions between start and tc_scenario(action="record_finish"), then read the scenario from finish. (1C 8.3.2+)
run_scenario(uilog=null, path=null, result_mode='summary') Replay uilog XML or path on the current form. Unsupported steps are skipped/listed; first failure stops at 0-based stopped_at. total counts reported steps, played counts attempted steps including failures. ok means all attempted commands accepted, not all effects verified; full steps[].changed follows each action's contract. Default summary; result_mode=full adds steps. Logs retain full details in both modes. Set connection_id when several clients are connected. Use tc_session(action="list_connections"). Success may omit target/connection echoes and shorten window details.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | ||
| uilog | No | ||
| action | Yes | ||
| result_mode | No | ||
| connection_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and delivers: error semantics (ok=false/error/path), unrecoverable write failure after recording already stopped, finish_not_confirmed XML preservation, lost_actions meaning, no_effect scope caveats, observed/not_observed counting, and that ok means commands accepted rather than effects verified. This is unusually rich disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded purpose followed by a scannable per-action bullet list; nearly every sentence conveys constraints or semantics. It is long, but the density is justified by six actions with distinct contracts, with only minor repetition between the header note and the bullet bodies.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-action mutation/replay tool with no annotations and no output schema, the description supplies action contracts, error and partial-failure behavior, result_mode semantics, and a cross-client connection note. Nothing essential to correct invocation appears missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it largely does: path is relative to the SERVER working directory and returned absolute, uilog carries XML or a path for run_scenario, result_mode summary vs full is explained, and connection_id is tied to multi-client sessions. Only path/uilog format syntax is left thin.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Record and replay UI scenarios') and then enumerates six sub-actions, each with its own specific purpose. An agent can distinguish record_* from run_scenario and from sibling tools like tc_form/tc_window 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit sequencing (perform real actions between record_start and record_finish, then read from finish; replay via run_scenario) and cross-references tc_session for connection_id. It does not state any when-not-to-use condition, but usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tc_sessionA
Connect to, launch or stop the 1C test client.
marks a required action parameter; the group schema treats action parameters as optional. Pass action="name" and only that action's parameters. Actions:
connect(port=null, host='127.0.0.1', version=null, profile=null) Connect to a running /TESTCLIENT -TPort client using port or a list_profiles profile; explicit parameters override the profile. version must match the full running version (omitted: built-in default). Connect before UI actions. A new host/port creates a connection; the same host/port reconnects that client: connection_id is retained, but find elements again.
disconnect(force=False) Close the connection to the test client. force=true interrupts a pending network call; its result may be unknown. The 1C application remains running.
get_logging_status() Return call logging status, paths, call count, disk usage and any reason recording stopped.
launch_client(base=null, port=null, server=False, user=null, password=null, version=null, exe=null, extra_args=null, wait=120, connect=True, desktop='default', profile=null) Launch and optionally connect. base is a file infobase path, or 'server\infobase' with server=true; alternatively use a list_profiles profile. Explicit parameters override the profile. user/password are infobase credentials; the password is visible in the process command line. exe is the full path to 1cv8/1cv8c (with .exe on Windows); omitted: configured or auto-detected installation. A version prefix selects the latest matching build; use a full version or exe for an exact build. Omitted port allocates a free local port; each launch creates a connection_id. wait covers total startup including readiness; increase for slow bases. Linux default needs DISPLAY/XAUTHORITY; isolated needs Xvfb. isolated uses a separate desktop (Windows 10+/Linux) and stops with the server. connect=false confirms only an answering port, not a usable client.
list_connections() List registered clients with connection_id, profile, host, port, base, user and recording status. busy, active_action and active_seconds describe the running call. connected reports an open connection, not client responsiveness. base/user are known for clients launched here.
list_profiles() List named launch/connect profiles and their descriptions and settings, without passwords. Pass the name as profile to the listed action. Does not connect to or launch a client.
start_logging(screenshot_mode=null, reports=null) Start a call journal. Repeated start keeps the current journal. screenshot_mode: off, actions (changes and errors), or all calls; default follows server settings. reports: ["html"], ["allure"], ["html", "allure"], or ["none"] for JSONL only. Omit reports to use the server's configured formats; the response lists the selected reports. Saves files on the server. Allure results are finalized when logging stops.
stop_client(graceful_timeout=15) Stop the test client started by launch_client in this connection, and disconnect from it. Tries normal exit for graceful_timeout seconds (0..120, default 15), confirming known exit questions, then forces termination if needed. 0 forces termination immediately. Unsaved changes may be lost. Returns shutdown: graceful, forced, or already_exited; forced includes shutdown_reason. A failed stop retains process ownership for retry.
stop_logging() Stop call logging, finalize selected reports and return their paths. Does not stop the client. Set connection_id when several clients are connected. Use tc_session(action="list_connections"). Success may omit target/connection echoes and shorten window details.
| Name | Required | Description | Default |
|---|---|---|---|
| exe | No | ||
| base | No | ||
| host | No | ||
| port | No | ||
| user | No | ||
| wait | No | ||
| force | No | ||
| action | Yes | ||
| server | No | ||
| connect | No | ||
| desktop | No | ||
| profile | No | ||
| reports | No | ||
| version | No | ||
| password | No | ||
| extra_args | No | ||
| connection_id | No | ||
| screenshot_mode | No | ||
| graceful_timeout | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral load and does so richly: password visible in the process command line, wait covers total startup including readiness, force=true may leave an unknown result, unsaved changes may be lost on stop, failed stop retains process ownership for retry, repeated start_logging keeps the current journal, and Allure results finalize only on stop.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Length is justified by nine sub-actions. The dispatch grammar ('required action parameter... pass action="name" and only that action's parameters') is front-loaded, then each action is a compact bullet with only its own parameters and gotchas. No filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 19-parameter, action-dispatched tool with no annotations and no output schema, the description is complete: it covers connection semantics, credentials, launch/version selection, logging modes and report formats, shutdown result values (graceful/forced/already_exited), and even notes that success responses may omit echoes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it largely does — port, host, version (full version vs prefix), profile override behavior, base ('server\infobase' with server=true), user/password, exe path rules, wait, desktop (isolated needs Xvfb), screenshot_mode, reports, graceful_timeout, and connection_id are all explained. Only extra_args is left undefined, a minor gap against 19 parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states exactly what the tool is (a connection/launch/stop controller for the 1C test client) and enumerates all nine actions with their concrete purposes. Each action is a specific verb+resource (connect, disconnect, launch_client, start_logging...), and the sibling UI tools (tc_table, tc_app, etc.) are implicitly differentiated as post-connection actions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing is given: 'Pass action="name" and only that action's parameters', 'Connect before UI actions', and 'Set connection_id when several clients are connected'. Action-level guidance includes when to use launch_client vs connect, and connect=false semantics vs. a real connection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tc_tableA
Read and edit table or tree rows, manage selection and expand or collapse nodes. Choose action.
Also available: tc_field(action="is_visible"), tc_field(action="is_enabled"), tc_field(action="get_context_menu"), tc_app(action="get_parent").
marks a required action parameter; the group schema treats action parameters as optional. Pass action="name" and only that action's parameters. ok=true means accepted; verify effects by reading state. target_check: present, unknown (uncheckable), off (disabled); present does not prove an effect. target_hidden=true means the target exists but is invisible; it describes the element, not its ancestors. Its absence says nothing; hidden targets may still act (e.g. activate). Invalid addresses are rejected only where the address can be checked; an unverified empty read may mean a missing target. failure_context describes state/editor/choices; its complete=false means incomplete diagnostics. Actions:
add_rows(ref*, rows*) Add and fill 1–100 rows: rows=[{cells:[{column: element name, text: ...}]}], at most 1000 cells. Each cell uses text for an input column or checked=true/false for a checkbox column, never both. Requires finished row editing. Stops at the first refusal; earlier edits remain. results use 0-based input indexes; added=null means creation could not be confirmed. Each completed row is checked when filled, not after later rows. Does not save the document. (1C 8.3.12+)
can_be_expanded(ref*, row_column=null, row_value=null) Whether a table row/group can be expanded. Pass row_column+row_value to target a specific row by a column name or title; omit them to use the current row. can_expand=true does not promise that tc_table(action="expand") will work: rows reporting true have been observed to stay collapsed. The reliable evidence is tc_table(action="expand")'s own value_before/value_after pair.
change_row(ref*) Start editing the current table row/column. Activate the intended column first. Needs an existing row not already in edit mode. edit_mode confirms whether editing started; null means it could not be checked. For text input use set_cell_text for automatic preparation.
choose_row(ref*) Choose/double-click the current row: selects and closes a choice form, opens an item's card in a list (a folder's own card, not its contents). changed tracks ACTIVE WINDOW change only. If false, read the destination field: selection may have succeeded without closing a window.
collapse(ref*, row_column=null, row_value=null) Collapse a form group or table node. For tables, row_column+row_value targets a row by column name/title; omitted: current row. No collapsible node is not an error. changed=false only for equal successfully read value_before/value_after; null for form groups, read failures or readback=off. can_be_expanded applies only to table rows and does not guarantee an effect; verify before/after.
copy_row(ref*, confirm=null) Copy the current table row. On catalog/document lists a confirmation dialog may appear — set confirm=True/False to auto-answer it (default None: no dialog handling). (1C 8.3.25+)
delete_row(ref*, confirm=null) Deprecated alias for delete_rows(scope="current"). Use delete_rows for new calls. (1C 8.3.3+)
delete_rows(ref*, confirm=null, scope='current', unmark=False) Delete current or selected rows (selected: 8.3.6+, standard context-menu Delete/Mark, preserving selection). confirm=true/false answers; null leaves confirmation open. Lists may mark instead of remove. deleted=null means unverified. unmark=true removes marks (8.3.6+), only in lists with a standard marking command, not ordinary tables. (1C 8.3.3+)
deselect_all_rows(ref*) Clear the table's row selection. Needs platform 8.5.1 or newer — on every earlier one the platform has no such method. Plain row navigation drops the selection down to the current row, which is the only way to undo a multi-row selection there. (1C 8.5.1+)
deselect_row(ref*) Remove the current table row from the selection. Needs platform 8.5.1 or newer — on every earlier one the platform has no such method. The closest thing there is to pass over the row with toggle_selection set: that toggles it, so a selected row becomes unselected. (1C 8.5.1+)
end_edit_row(ref*, cancel=False) Finish editing the current table row. Set cancel to discard the edits instead of committing them.
expand(ref*, row_column=null, row_value=null, subordinates=False) Expand a form group or table node; subordinates also expands child rows. For tables, row_column+row_value targets a row by column name/title; omitted: current row. No expandable node is not an error. changed=false only for equal successfully read value_before/value_after; null for form groups, read failures or readback=off. can_be_expanded applies only to table rows and does not guarantee an effect; verify before/after.
find_rows(ref*, conditions*, columns=null, case_sensitive=False, max_rows=500, max_matches=50, text_format='plain') Search selectable rows of the CURRENT table, respecting filters/collapsed groups; never a database-wide search. conditions is an AND-list of {column: displayed TITLE, text, match: exact/contains/starts_with/ends_with}; literal, case-insensitive by default. Ignore search highlighting for comparison; plain removes it in results, raw retains it. Empty text matches displayed emptiness. columns selects returned titles. max_rows bounds checked rows, not client response; max_matches bounds matches. complete covers this table; matches_truncated marks omitted matches. No stable order/row IDs. Uses read_rows: clears selection, may reposition an unavailable cursor on older platforms; refuses unfinished row edits. (1C 8.3.6+)
get_cell_text(ref*, column*) Read the current row's displayed cell (may contain search markup). column is an element NAME or 0-based index; digit strings are indexes. Unknown/ambiguous names refuse; a matching title suggests the name. null does not prove emptiness. A COLUMN GROUP displayed as one column may return neighbouring/group text indistinguishable from the intended value; other-kind members may return null. A nonexistent table can also return text=null.
get_current_item(ref*) Get the current item of a table → {ref}. ref: the table.
get_current_row(ref*) Get the current table row as [{column: value}]. Returns [] if there is no current row or its values could not be read. Needs platform 8.5.1 or newer — on every earlier one, use get_selected_rows after moving to the desired row, or get_cell_text to read one column. (1C 8.5.1+)
get_list_settings(ref*, max_rows=500, timeout=180) Read filters and sorting through the list's standard settings form. Closes settings opened by this call. filters contains expanded tree rows, including the root and groups; orders follows sort priority. Values are displayed text. max_rows limits each settings table (1–10000). timeout bounds the operation in seconds (greater than 0, at most 3600). (1C 8.3.12+)
get_list_settings_fields(ref*, section='filters', max_rows=500, timeout=180) List available field captions for filters or orders through the standard list settings. Returns visible fields; collapsed branches are not traversed. Closes settings opened by this call. timeout limits the operation in seconds (0 < timeout <= 3600). (1C 8.3.12+)
get_selected_rows(ref*) Read selected rows as {column title: displayed value} maps. Row order is not guaranteed. The platform chooses the columns. Missing columns are unread, not empty; empty text can also represent an omitted value. Values may contain search highlighting. Use read_rows to read all selectable rows of the current table. (1C 8.3.6+)
go_one_level_down(ref*, row_column=null, row_value=null, column=null) Go one level down in a table tree. Pass row_column+row_value to target a specific row by a column value; row_column accepts a column name or title. Omit both to use the current row. Optional column names a column to read before and after the move; changed compares its cell text.
go_one_level_up(ref*, row_column=null, row_value=null, column=null) Go one level up in a table tree. Pass row_column+row_value to target a specific row by a column value; row_column accepts a column name or title. Omit both to use the current row. Optional column names a column to read before and after the move; changed compares its cell text.
goto_first_row(ref*, toggle_selection=False, column=null) Move to the first row of a table. Set toggle_selection to also toggle that row's selection. Pass column (the column element NAME) to have that cell read before and after the move: it comes back as value_before/value_after with changed=true when they differ. changed=false only means the two texts are the same — different rows can share a value; without column nothing is read and changed is null.
goto_last_row(ref*, toggle_selection=False, column=null) Move to the last row of a table. Set toggle_selection to also toggle that row's selection. Pass column (the column element NAME) to have that cell read before and after the move: it comes back as value_before/value_after with changed=true when they differ. changed=false only means the two texts are the same — different rows can share a value; without column nothing is read and changed is null.
goto_next_item(ref*) Move to the next item within a table. ref: the table.
goto_next_row(ref*, toggle_selection=False, column=null) Move to the next row of a table. Set toggle_selection to also toggle that row's selection. Pass column (the column element NAME) to have that cell read before and after the move: it comes back as value_before/value_after with changed=true when they differ. changed=false only means the two texts are the same — different rows can share a value; without column nothing is read and changed is null.
goto_previous_item(ref*) Move to the previous item within a table. ref: the table.
goto_previous_row(ref*, toggle_selection=False, column=null) Move to the previous row of a table. Set toggle_selection to also toggle that row's selection. Pass column (the column element NAME) to have that cell read before and after the move: it comes back as value_before/value_after with changed=true when they differ. changed=false only means the two texts are the same — different rows can share a value; without column nothing is read and changed is null.
goto_row(ref*, column=null, value=null, direction='down', toggle_selection=False, fields=null) Seek by column (displayed TITLE, not index) and value, or fields={title:value} for multiple columns; do not combine them. Values accept int/string and * ? wildcards; matching is case-sensitive displayed text. Searches FROM AND INCLUDING current row towards down/up, without wrapping. Step away first for the next match. A miss moves to the last row going down, or the first going up. toggle_selection toggles the destination; without criteria, the current row. found=null means no criteria or undetermined, never not-found. criteria uses titles; observed.column uses the element name. Refuses inactive containing pages. (1C 8.3.2+)
is_expanded(ref*, row_column=null, row_value=null) Whether a table row is expanded. Without row_column this reads the CURRENT row. Pass row_column (column name or title) and row_value to read another row without moving the cursor.
read_rows(ref*, max_rows=500, columns=null, text_format='plain') Read selectable rows within current filters/collapsed groups: row_count and at most max_rows (0: count only), unordered. columns selects returned titles; plain strips known search highlighting, raw retains it. Temporarily selects rows, then clears ALL previous selection. Keeps a usable current row; older platforms may move an unavailable cursor to first (cursor_repositioned=true). Single-selection tables are read sequentially (10000-row, 180-second scan limits), restoring the current row. Refuses unfinished row edits and inactive containing pages. (1C 8.3.6+)
search(ref*, text*, max_rows=500, timeout=180, settle_time=2, columns=null, text_format='plain') Set the list's standard search string (empty clears), preserving filters. Returns rows after input readback and two equal row reads settle_time seconds apart; stability is not a platform completion signal. max_rows=1..10000; truncated means more rows. 0<settle_time<timeout<=3600; timeout covers the action. columns selects titles; raw retains search highlighting. Reading clears selection; unfinished edits refuse. (1C 8.3.12+)
select_all_rows(ref*) Select all rows of a table. (1C 8.3.6+)
select_row(ref*) Add the current table row to the selection. Needs platform 8.5.1 or newer — on every earlier one the platform has no such method. Build a selection there by moving through rows with toggle_selection set — each row the cursor passes is toggled. (1C 8.5.1+)
set_cell_text(ref*, column*, text*) Set current-row column by element NAME; manages focus, continues existing row edits, finishes without discarding other cells, then reads back. Empty text clears. Returns verified/changed and displayed value_before/value_after; empty_value confirms emptiness despite formatting; numeric_equivalent may give verified=null. row_edit_pending means validation/reference choice kept editing: continue at the returned editor or end_edit_row(cancel=true). value_verification_inconclusive means editing finished but rounded output prevents exact verification.
set_list_settings(ref*, filters=null, orders=null, replace=False, max_rows=500, timeout=180) Apply standard list filters/sorting; field is an exact available caption, value is displayed text. filters/orders follow their schemas. Adds by default; replace=true replaces only supplied sections ([] clears one). Success applies and closes settings; failure leaves them open and earlier edits may remain. 0<timeout<=3600 seconds covers the operation. (1C 8.3.12+)
set_order(ref*, column*) Sort a table by a column, addressed by its TITLE. There is no direction parameter and no way to read the current direction: calling it again on the same column reverses the order. To learn which way it went, go to the first row and read a cell. (1C 8.3.6+)
set_row_values(ref*, cells*) Fill 1..100 cells of the current row: {column: element NAME, text} or {column, checked}. Matching checkboxes are not toggled. Continues editing, finishes once after all entries, then reads back. Refusal/unexpected editor stops with earlier edits preserved for completion/cancel. completed counts entries; edit_finished confirms row completion; final_verified=null may mean numeric equivalence. Results use 0-based input order. Does not add rows, alter selection or save. (1C 8.3.12+)
switch_row_delete_mark(ref*, confirm=True) Toggle the current row's deletion mark; confirm=true answers Yes, false No. dialog_answered proves only a response; changed is always null (no readable mark flag). To verify, invoke the mark command again and read its question: mark means currently unmarked, remove mark means marked. (1C 8.3.6+)
table_add_row(ref*) Add a row to a form table. Fill its cells with set_cell_text using column element names. ref selects the client; otherwise set connection_id when several clients are connected. Use tc_session(action="list_connections"). Success may omit target/connection echoes and shorten window details. Use returned references unchanged in ref; re-find expired elements.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | ||
| rows | No | ||
| text | No | ||
| cells | No | ||
| scope | No | ||
| value | No | ||
| action | Yes | ||
| cancel | No | ||
| column | No | ||
| fields | No | ||
| orders | No | ||
| unmark | No | ||
| columns | No | ||
| confirm | No | ||
| filters | No | ||
| replace | No | ||
| section | No | ||
| timeout | No | ||
| max_rows | No | ||
| direction | No | ||
| row_value | No | ||
| conditions | No | ||
| row_column | No | ||
| max_matches | No | ||
| settle_time | No | ||
| text_format | No | ||
| subordinates | No | ||
| connection_id | No | ||
| case_sensitive | No | ||
| toggle_selection | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so extensively: it explains ok/verification semantics, target_check and target_hidden behavior, failure_context, platform version gates, side effects such as selection clearing and cursor repositioning, refusal behavior, confirmation dialogs, and readback limitations. This is unusually rich behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is necessarily large for 39 actions and 30 parameters, but it is front-loaded with global caveats and structured as per-action bullets. Repetition across goto_* and expand/collapse descriptions prevents a perfect conciseness score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, yet the per-action descriptions describe return fields, null/uncertainty semantics, and verification requirements. Given zero annotation coverage and zero schema description coverage, the description is complete enough for correct invocation of this complex multi-action tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and there are 30 parameters with nested objects, so the description must compensate, and it does: it documents rows/cells shapes, find_rows conditions, goto_row field/wildcard matching, set_list_settings filters/orders, timeout and settle_time bounds, confirm/unmark behavior, and ref/connection_id usage. It fully covers the semantic burden left by the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening states a specific verb and resource: read/edit table or tree rows, manage selection, and expand or collapse nodes. It names some sibling alternatives, but does not give a single high-level distinction from every sibling, so it is clear rather than perfect.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit alternatives for some operations (tc_field, tc_app) and per-action guidance such as delete_row being a deprecated alias and set_cell_text being preferred for text input. It lacks systematic when-to-use vs all siblings, but action selection is well supported.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tc_windowA
Actions on the client application window. Also available: tc_field(action="is_visible"), tc_field(action="is_enabled"), tc_field(action="get_context_menu"), tc_app(action="get_parent").
marks a required action parameter; the group schema treats action parameters as optional. Pass action="name" and only that action's parameters. Actions:
activate_window() Activate the current active window. (1C 8.3.3+)
answer_dialog(confirm=True, timeout=5) Wait up to timeout seconds and answer a modal question: confirm=true presses Button0, false Button1. Never presses Button2; inspect the question/window for other choices. Returns answered='Да'/'Нет' and question; both null means no dialog, question alone null means unreadable text. (1C 8.3.3+)
choose_user_message(text*) Click the first user message matching text in the active window; * and ? are wildcards. Use get_user_message_texts to read the available messages first. (1C 8.3.3+)
close_user_messages_panel() Close the window's user-messages panel. This is also how you tell which messages belong to which action: clear the panel, perform the action, then read the messages. (1C 8.3.6+)
close_window(ref=null) Close the window at ref, or the active window if omitted. Returns closed only after verifying that the window disappeared. If it remains open, returns window_not_closed and target; inspect the form or answer its dialog before retrying. Also closes an active local print preview when ref is omitted. (1C 8.3.3+)
execute_command(command*) Open a navigation link, e.g. 'e1cib/list/Справочник.Контрагенты', 'e1cib/app/Обработка.Имя' or a URL returned by the command interface. For a button name or title, find it and use click. Returns the resulting window; window_changed=false reuses the previous window description. An opened error window is a failure. (1C 8.3.3+)
get_command_interface() Get the window's command interface → collection of buttons/groups. (1C 8.3.3+)
get_user_message_texts() Get the user-message texts currently shown in the window → list of strings. They may include earlier actions; the application can also replace the list with identical messages. To judge one action, call tc_window(action="close_user_messages_panel") first, then the action, then this. Messages may appear after the action returns. (1C 8.3.3+)
goto_next_window() Go to the next open window from the active main application window. The client returns an error if navigation is unavailable. (1C 8.3.6+)
goto_previous_window() Go to the previous open window from the active main application window. The client returns an error if navigation is unavailable. (1C 8.3.6+)
goto_start_page() Go to the start page from the active main application window. The client returns an error if navigation is unavailable. (1C 8.3.6+) ref selects the client; otherwise set connection_id when several clients are connected. Use tc_session(action="list_connections"). Success may omit target/connection echoes and shorten window details. Use returned references unchanged in ref; re-find expired elements.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | ||
| text | No | ||
| action | Yes | ||
| command | No | ||
| confirm | No | ||
| timeout | No | ||
| connection_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, and it does so thoroughly. It discloses return values for answer_dialog, close_window, and execute_command; failure conditions such as window_not_closed and opened error windows; timeout behavior; dialog button mapping; wildcard matching; and caveats about omitted return values and expired references. This is unusually rich behavioral context for a mutation-capable tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but the length is justified by the 11-action dispatcher and each action's distinct parameters and return behavior. It is front-loaded with the tool's scope and sibling alternatives, then moves into structured action definitions. Version notes and usage caveats are compact and earn their place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations, no output schema, seven parameters, and zero schema description coverage, this description is complete enough for an agent to call the tool correctly. It covers action selection, parameter usage, alternative tools, return semantics, failure modes, and connection targeting. Nothing essential for correct invocation appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does. It explains that action is required and action-specific parameters are passed by name; documents ref and connection_id selection; describes text wildcards; gives command examples; explains confirm and timeout semantics for answer_dialog; and notes the default timeout value. Every parameter is given meaning beyond the bare JSON schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states that this tool performs actions on the client application window and then enumerates each action with a specific verb and resource, such as activate_window, close_window, execute_command, and answer_dialog. It also distinguishes the tool from siblings by listing related actions available through tc_field, tc_app, etc. An agent can select the correct action without opening another tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit sequencing and alternatives: use get_user_message_texts before choose_user_message, use close_user_messages_panel to isolate messages from one action, use click for button names instead of execute_command, and use tc_session(action="list_connections") when multiple clients are connected. It also explains ref vs connection_id selection. These are concrete when-to-use and when-to-use-alternative instructions.
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.
5 tool updates
v1.8.0- Changed
tc_field12 fields changed- added
Input schema / $defs / RefSelectEntryAdded value: +{ + "additionalProperties": false, + "properties": { + "ref": { + "title": "Ref", + "type": "string" + }, + "select": { + "$ref": "#/$defs/Selection" + } + }, + "required": [ + "ref", + "select" + ], + "title": "RefSelectEntry", + "type": "object" +} - added
Input schema / $defs / SelectionAdded value: +{ + "additionalProperties": false, + "properties": { + "choice_column": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Choice Column" + }, + "choice_table": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Choice Table" + }, + "data_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Data Type" + }, + "expected": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Expected" + }, + "match": { + "anyOf": [ + { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Match" + }, + "max_rows": { + "default": 500, + "title": "Max Rows", + "type": "integer" + }, + "timeout": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "number" + } + ], + "default": 180, + "title": "Timeout" + }, + "value": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Value" + } + }, + "title": "Selection", + "type": "object" +} - changed
Input schema / properties / action / enumPrevious value: -[ - "activate", - "cancel_edit", - "choose_from_drop_list", - "clear", - "click", - "click_view_status_item", - "close_drop_list", - "create", - "current_check", - "current_mode_is_edit", - "current_opened", - "decrease_value", - "delete_view_status_item", - "drop_list_is_open", - "execute_choice_from_choice_list", - "get_choice_list", - "get_command_bar", - "get_context_menu", - "get_current_page", - "get_data_presentation", - "get_edit_text", - "get_linked_window", - "get_state_presentation", - "get_text", - "get_tooltip", - "get_view_status_item_texts", - "goto_value", - "increase_value", - "input_text", - "is_enabled", - "is_readonly", - "is_visible", - "open_drop_list", - "open_field", - "read_fields", - "select_option", - "set_check", - "set_fields", - "start_choosing", - "start_choosing_from_choice_list", - "title_is_shown", - "wait_for_drop_list_generation" -]New value: +[ + "activate", + "cancel_edit", + "choose_from_drop_list", + "clear", + "click", + "click_view_status_item", + "close_drop_list", + "create", + "current_check", + "current_mode_is_edit", + "current_opened", + "decrease_value", + "delete_view_status_item", + "drop_list_is_open", + "execute_choice_from_choice_list", + "get_choice_list", + "get_command_bar", + "get_context_menu", + "get_current_page", + "get_data_presentation", + "get_edit_text", + "get_linked_window", + "get_state_presentation", + "get_text", + "get_tooltip", + "get_view_status_item_texts", + "goto_value", + "increase_value", + "input_text", + "is_enabled", + "is_readonly", + "is_visible", + "open_drop_list", + "open_field", + "read_fields", + "select_option", + "select_value", + "set_check", + "set_fields", + "start_choosing", + "start_choosing_from_choice_list", + "title_is_shown", + "wait_for_drop_list_generation" +] - added
Input schema / properties / choice_columnAdded value: +{ + "default": null, + "title": "Choice Column", + "type": "string" +} - added
Input schema / properties / choice_tableAdded value: +{ + "default": null, + "title": "Choice Table", + "type": "string" +} - added
Input schema / properties / data_typeAdded value: +{ + "default": null, + "title": "Data Type", + "type": "string" +} - changed
Input schema / properties / entries / items / anyOfPrevious value: -[ - { - "$ref": "#/$defs/RefEntry" - }, - { - "$ref": "#/$defs/RefCheckEntry" - } -]New value: +[ + { + "$ref": "#/$defs/RefEntry" + }, + { + "$ref": "#/$defs/RefCheckEntry" + }, + { + "$ref": "#/$defs/RefSelectEntry" + } +] - added
Input schema / properties / expectedAdded value: +{ + "default": null, + "title": "Expected", + "type": "string" +} - added
Input schema / properties / matchAdded value: +{ + "additionalProperties": { + "type": "string" + }, + "default": null, + "maxProperties": 32, + "minProperties": 1, + "title": "Match", + "type": "object" +} - added
Input schema / properties / max_rowsAdded value: +{ + "default": null, + "title": "Max Rows", + "type": "integer" +} - added
Input schema / properties / timeout / anyOfAdded value: +[ + { + "type": "integer" + }, + { + "type": "number" + } +] - removed
Input schema / properties / timeout / typeRemoved value: -"integer"
- Changed
tc_find2 fields changed- added
Input schema / properties / cursorAdded value: +{ + "default": null, + "title": "Cursor", + "type": "string" +} - added
Input schema / properties / limitAdded value: +{ + "default": null, + "title": "Limit", + "type": "integer" +}
- Changed
tc_form4 fields changed- added
Input schema / properties / include_commandsAdded value: +{ + "default": null, + "title": "Include Commands", + "type": "boolean" +} - added
Input schema / properties / result_modeAdded value: +{ + "default": null, + "enum": [ + "changes", + "full" + ], + "title": "Result Mode", + "type": "string" +} - added
Input schema / properties / root_refAdded value: +{ + "default": null, + "title": "Root Ref", + "type": "string" +} - added
Input schema / properties / visible_onlyAdded value: +{ + "default": null, + "title": "Visible Only", + "type": "boolean" +}
- Changed
tc_scenario1 field changed- added
Input schema / properties / result_modeAdded value: +{ + "default": null, + "enum": [ + "summary", + "full" + ], + "title": "Result Mode", + "type": "string" +}
- Changed
tc_table10 fields changed- added
Input schema / $defs / FilterAdded value: +{ + "additionalProperties": false, + "properties": { + "comparison": { + "default": "eq", + "enum": [ + "eq", + "ne", + "gt", + "ge", + "lt", + "le", + "contains", + "not_contains", + "filled", + "not_filled" + ], + "title": "Comparison", + "type": "string" + }, + "enabled": { + "default": true, + "title": "Enabled", + "type": "boolean" + }, + "field": { + "minLength": 1, + "title": "Field", + "type": "string" + }, + "value": { + "default": "", + "title": "Value", + "type": "string" + } + }, + "required": [ + "field" + ], + "title": "Filter", + "type": "object" +} - added
Input schema / $defs / OrderAdded value: +{ + "additionalProperties": false, + "properties": { + "direction": { + "default": "asc", + "enum": [ + "asc", + "desc" + ], + "title": "Direction", + "type": "string" + }, + "enabled": { + "default": true, + "title": "Enabled", + "type": "boolean" + }, + "field": { + "minLength": 1, + "title": "Field", + "type": "string" + } + }, + "required": [ + "field" + ], + "title": "Order", + "type": "object" +} - changed
Input schema / properties / action / enumPrevious value: -[ - "add_rows", - "can_be_expanded", - "change_row", - "choose_row", - "collapse", - "copy_row", - "delete_row", - "delete_rows", - "deselect_all_rows", - "deselect_row", - "end_edit_row", - "expand", - "find_rows", - "get_cell_text", - "get_current_item", - "get_current_row", - "get_selected_rows", - "go_one_level_down", - "go_one_level_up", - "goto_first_row", - "goto_last_row", - "goto_next_item", - "goto_next_row", - "goto_previous_item", - "goto_previous_row", - "goto_row", - "is_expanded", - "read_rows", - "select_all_rows", - "select_row", - "set_cell_text", - "set_order", - "set_row_values", - "switch_row_delete_mark", - "table_add_row" -]New value: +[ + "add_rows", + "can_be_expanded", + "change_row", + "choose_row", + "collapse", + "copy_row", + "delete_row", + "delete_rows", + "deselect_all_rows", + "deselect_row", + "end_edit_row", + "expand", + "find_rows", + "get_cell_text", + "get_current_item", + "get_current_row", + "get_list_settings", + "get_list_settings_fields", + "get_selected_rows", + "go_one_level_down", + "go_one_level_up", + "goto_first_row", + "goto_last_row", + "goto_next_item", + "goto_next_row", + "goto_previous_item", + "goto_previous_row", + "goto_row", + "is_expanded", + "read_rows", + "search", + "select_all_rows", + "select_row", + "set_cell_text", + "set_list_settings", + "set_order", + "set_row_values", + "switch_row_delete_mark", + "table_add_row" +] - added
Input schema / properties / filtersAdded value: +{ + "default": null, + "items": { + "$ref": "#/$defs/Filter" + }, + "maxItems": 100, + "title": "Filters", + "type": "array" +} - added
Input schema / properties / ordersAdded value: +{ + "default": null, + "items": { + "$ref": "#/$defs/Order" + }, + "maxItems": 100, + "title": "Orders", + "type": "array" +} - added
Input schema / properties / replaceAdded value: +{ + "default": null, + "title": "Replace", + "type": "boolean" +} - added
Input schema / properties / sectionAdded value: +{ + "default": null, + "enum": [ + "filters", + "orders" + ], + "title": "Section", + "type": "string" +} - added
Input schema / properties / settle_timeAdded value: +{ + "default": null, + "title": "Settle Time", + "type": "number" +} - added
Input schema / properties / text_formatAdded value: +{ + "default": null, + "enum": [ + "plain", + "raw" + ], + "title": "Text Format", + "type": "string" +} - added
Input schema / properties / timeoutAdded value: +{ + "default": null, + "title": "Timeout", + "type": "number" +}
2 tool updates
v1.7.1- Changed
tc_session3 fields changed- added
Input schema / properties / forceAdded value: +{ + "default": null, + "title": "Force", + "type": "boolean" +} - added
Input schema / properties / graceful_timeoutAdded value: +{ + "default": null, + "title": "Graceful Timeout", + "type": "number" +} - added
Input schema / properties / reportsAdded value: +{ + "default": null, + "items": { + "enum": [ + "html", + "allure", + "none" + ], + "type": "string" + }, + "title": "Reports", + "type": "array" +}
- Changed
tc_window1 field changed- added
Input schema / properties / refAdded value: +{ + "default": null, + "title": "Ref", + "type": "string" +}
1 tool update
v1.5.1- Changed
tc_table3 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "add_rows", - "can_be_expanded", - "change_row", - "choose_row", - "collapse", - "copy_row", - "delete_row", - "deselect_all_rows", - "deselect_row", - "end_edit_row", - "expand", - "find_rows", - "get_cell_text", - "get_current_item", - "get_current_row", - "get_selected_rows", - "go_one_level_down", - "go_one_level_up", - "goto_first_row", - "goto_last_row", - "goto_next_item", - "goto_next_row", - "goto_previous_item", - "goto_previous_row", - "goto_row", - "is_expanded", - "read_rows", - "select_all_rows", - "select_row", - "set_cell_text", - "set_order", - "set_row_values", - "switch_row_delete_mark", - "table_add_row" -]New value: +[ + "add_rows", + "can_be_expanded", + "change_row", + "choose_row", + "collapse", + "copy_row", + "delete_row", + "delete_rows", + "deselect_all_rows", + "deselect_row", + "end_edit_row", + "expand", + "find_rows", + "get_cell_text", + "get_current_item", + "get_current_row", + "get_selected_rows", + "go_one_level_down", + "go_one_level_up", + "goto_first_row", + "goto_last_row", + "goto_next_item", + "goto_next_row", + "goto_previous_item", + "goto_previous_row", + "goto_row", + "is_expanded", + "read_rows", + "select_all_rows", + "select_row", + "set_cell_text", + "set_order", + "set_row_values", + "switch_row_delete_mark", + "table_add_row" +] - added
Input schema / properties / scopeAdded value: +{ + "default": null, + "enum": [ + "current", + "selected" + ], + "title": "Scope", + "type": "string" +} - added
Input schema / properties / unmarkAdded value: +{ + "default": null, + "title": "Unmark", + "type": "boolean" +}
5 tool updates
v1.5.0- Changed
tc_app1 field changed- added
Input schema / properties / scopeAdded value: +{ + "default": null, + "enum": [ + "window", + "application" + ], + "title": "Scope", + "type": "string" +}
- Changed
tc_find1 field changed- added
Input schema / properties / scopeAdded value: +{ + "default": null, + "enum": [ + "window", + "application" + ], + "title": "Scope", + "type": "string" +}
- Changed
tc_session3 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "connect", - "disconnect", - "launch_client", - "list_connections", - "stop_client" -]New value: +[ + "connect", + "disconnect", + "get_logging_status", + "launch_client", + "list_connections", + "list_profiles", + "start_logging", + "stop_client", + "stop_logging" +] - added
Input schema / properties / profileAdded value: +{ + "default": null, + "title": "Profile", + "type": "string" +} - added
Input schema / properties / screenshot_modeAdded value: +{ + "default": null, + "enum": [ + "off", + "actions", + "all" + ], + "title": "Screenshot Mode", + "type": "string" +}
- Changed
tc_table6 fields changed- added
Input schema / $defs / RowConditionAdded value: +{ + "additionalProperties": false, + "properties": { + "column": { + "minLength": 1, + "title": "Column", + "type": "string" + }, + "match": { + "default": "exact", + "enum": [ + "exact", + "contains", + "starts_with", + "ends_with" + ], + "title": "Match", + "type": "string" + }, + "text": { + "title": "Text", + "type": "string" + } + }, + "required": [ + "column", + "text" + ], + "title": "RowCondition", + "type": "object" +} - changed
Input schema / properties / action / enumPrevious value: -[ - "add_rows", - "can_be_expanded", - "change_row", - "choose_row", - "collapse", - "copy_row", - "delete_row", - "deselect_all_rows", - "deselect_row", - "end_edit_row", - "expand", - "get_cell_text", - "get_current_item", - "get_current_row", - "get_selected_rows", - "go_one_level_down", - "go_one_level_up", - "goto_first_row", - "goto_last_row", - "goto_next_item", - "goto_next_row", - "goto_previous_item", - "goto_previous_row", - "goto_row", - "is_expanded", - "read_rows", - "select_all_rows", - "select_row", - "set_cell_text", - "set_order", - "set_row_values", - "switch_row_delete_mark", - "table_add_row" -]New value: +[ + "add_rows", + "can_be_expanded", + "change_row", + "choose_row", + "collapse", + "copy_row", + "delete_row", + "deselect_all_rows", + "deselect_row", + "end_edit_row", + "expand", + "find_rows", + "get_cell_text", + "get_current_item", + "get_current_row", + "get_selected_rows", + "go_one_level_down", + "go_one_level_up", + "goto_first_row", + "goto_last_row", + "goto_next_item", + "goto_next_row", + "goto_previous_item", + "goto_previous_row", + "goto_row", + "is_expanded", + "read_rows", + "select_all_rows", + "select_row", + "set_cell_text", + "set_order", + "set_row_values", + "switch_row_delete_mark", + "table_add_row" +] - added
Input schema / properties / case_sensitiveAdded value: +{ + "default": null, + "title": "Case Sensitive", + "type": "boolean" +} - added
Input schema / properties / columnsAdded value: +{ + "default": null, + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 100, + "minItems": 1, + "title": "Columns", + "type": "array" +} - added
Input schema / properties / conditionsAdded value: +{ + "default": null, + "items": { + "$ref": "#/$defs/RowCondition" + }, + "maxItems": 32, + "minItems": 1, + "title": "Conditions", + "type": "array" +} - added
Input schema / properties / max_matchesAdded value: +{ + "default": null, + "title": "Max Matches", + "type": "integer" +}
- Changed
tc_window2 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "activate_window", - "answer_dialog", - "close_user_messages_panel", - "close_window", - "execute_command", - "get_command_interface", - "get_user_message_texts", - "goto_next_window", - "goto_previous_window", - "goto_start_page" -]New value: +[ + "activate_window", + "answer_dialog", + "choose_user_message", + "close_user_messages_panel", + "close_window", + "execute_command", + "get_command_interface", + "get_user_message_texts", + "goto_next_window", + "goto_previous_window", + "goto_start_page" +] - added
Input schema / properties / textAdded value: +{ + "default": null, + "title": "Text", + "type": "string" +}
6 tool updates
v1.4.0- Changed
tc_app4 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "clear_file_dialog_result", - "get_active_window", - "get_child_objects", - "get_current_error", - "get_max_action_time", - "get_parent", - "get_performance", - "set_file_dialog_result", - "set_max_action_time" -]New value: +[ + "clear_file_dialog_result", + "get_active_window", + "get_child_objects", + "get_current_error", + "get_max_action_time", + "get_parent", + "get_performance", + "get_screenshot", + "set_file_dialog_result", + "set_max_action_time" +] - added
Input schema / properties / gridAdded value: +{ + "default": null, + "title": "Grid", + "type": "boolean" +} - added
Input schema / properties / regionAdded value: +{ + "default": null, + "items": { + "type": "integer" + }, + "title": "Region", + "type": "array" +} - added
Input schema / properties / scaleAdded value: +{ + "default": null, + "title": "Scale", + "type": "integer" +}
- Changed
tc_doc3 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "begin_edit_current_area", - "click_formatted_doc_hyperlink", - "click_formatted_string_hyperlink", - "click_html_hyperlink", - "end_edit_current_area", - "get_area_text", - "get_current_area_address", - "get_current_area_field", - "get_current_area_text", - "get_doc_area_horizontal_size", - "get_doc_area_vertical_size", - "get_formatted_string_hyperlinks", - "get_html", - "included_in_merged_area", - "input_html", - "read_document", - "set_area_text", - "set_current_area", - "text_within_area_bounds", - "write_content_to_file" -]New value: +[ + "begin_edit_current_area", + "click_formatted_doc_hyperlink", + "click_formatted_string_hyperlink", + "click_html_hyperlink", + "end_edit_current_area", + "find_text", + "get_area_text", + "get_current_area_address", + "get_current_area_field", + "get_current_area_text", + "get_doc_area_horizontal_size", + "get_doc_area_vertical_size", + "get_formatted_string_hyperlinks", + "get_html", + "included_in_merged_area", + "input_html", + "read_document", + "set_area_text", + "set_current_area", + "text_within_area_bounds", + "write_content_to_file" +] - added
Input schema / properties / case_sensitiveAdded value: +{ + "default": null, + "title": "Case Sensitive", + "type": "boolean" +} - added
Input schema / properties / matchAdded value: +{ + "default": null, + "enum": [ + "contains", + "exact" + ], + "title": "Match", + "type": "string" +}
- Changed
tc_field7 fields changed- added
Input schema / $defsAdded value: +{ + "RefCheckEntry": { + "additionalProperties": false, + "properties": { + "checked": { + "title": "Checked", + "type": "boolean" + }, + "ref": { + "title": "Ref", + "type": "string" + } + }, + "required": [ + "ref", + "checked" + ], + "title": "RefCheckEntry", + "type": "object" + }, + "RefEntry": { + "additionalProperties": false, + "properties": { + "ref": { + "title": "Ref", + "type": "string" + }, + "text": { + "title": "Text", + "type": "string" + } + }, + "required": [ + "ref", + "text" + ], + "title": "RefEntry", + "type": "object" + }, + "RefTarget": { + "additionalProperties": false, + "properties": { + "ref": { + "title": "Ref", + "type": "string" + } + }, + "required": [ + "ref" + ], + "title": "RefTarget", + "type": "object" + } +} - changed
Input schema / properties / action / enumPrevious value: -[ - "activate", - "cancel_edit", - "choose_from_drop_list", - "clear", - "click", - "click_view_status_item", - "close_drop_list", - "create", - "current_check", - "current_mode_is_edit", - "current_opened", - "decrease_value", - "delete_view_status_item", - "drop_list_is_open", - "execute_choice_from_choice_list", - "get_choice_list", - "get_command_bar", - "get_context_menu", - "get_current_page", - "get_data_presentation", - "get_edit_text", - "get_linked_window", - "get_state_presentation", - "get_text", - "get_tooltip", - "get_view_status_item_texts", - "goto_value", - "increase_value", - "input_text", - "is_enabled", - "is_readonly", - "is_visible", - "open_drop_list", - "open_field", - "select_option", - "set_check", - "start_choosing", - "start_choosing_from_choice_list", - "title_is_shown", - "wait_for_drop_list_generation" -]New value: +[ + "activate", + "cancel_edit", + "choose_from_drop_list", + "clear", + "click", + "click_view_status_item", + "close_drop_list", + "create", + "current_check", + "current_mode_is_edit", + "current_opened", + "decrease_value", + "delete_view_status_item", + "drop_list_is_open", + "execute_choice_from_choice_list", + "get_choice_list", + "get_command_bar", + "get_context_menu", + "get_current_page", + "get_data_presentation", + "get_edit_text", + "get_linked_window", + "get_state_presentation", + "get_text", + "get_tooltip", + "get_view_status_item_texts", + "goto_value", + "increase_value", + "input_text", + "is_enabled", + "is_readonly", + "is_visible", + "open_drop_list", + "open_field", + "read_fields", + "select_option", + "set_check", + "set_fields", + "start_choosing", + "start_choosing_from_choice_list", + "title_is_shown", + "wait_for_drop_list_generation" +] - added
Input schema / properties / diagnosticsAdded value: +{ + "default": null, + "title": "Diagnostics", + "type": "boolean" +} - added
Input schema / properties / diagnostics_waitAdded value: +{ + "default": null, + "title": "Diagnostics Wait", + "type": "number" +} - added
Input schema / properties / entriesAdded value: +{ + "default": null, + "items": { + "anyOf": [ + { + "$ref": "#/$defs/RefEntry" + }, + { + "$ref": "#/$defs/RefCheckEntry" + } + ] + }, + "maxItems": 100, + "minItems": 1, + "title": "Entries", + "type": "array" +} - added
Input schema / properties / propertiesAdded value: +{ + "default": null, + "items": { + "enum": [ + "text", + "presentation", + "edit_text", + "visible", + "enabled", + "readonly" + ], + "type": "string" + }, + "maxItems": 6, + "minItems": 1, + "title": "Properties", + "type": "array" +} - added
Input schema / properties / targetsAdded value: +{ + "default": null, + "items": { + "$ref": "#/$defs/RefTarget" + }, + "maxItems": 100, + "minItems": 1, + "title": "Targets", + "type": "array" +}
- Changed
tc_form5 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "current_modified", - "execute_choice_from_list", - "execute_choice_from_menu", - "find_default_button", - "get_current_element", - "goto_next_element", - "goto_previous_element", - "wait_for_closing" -]New value: +[ + "compare_snapshot", + "create_snapshot", + "current_modified", + "delete_snapshot", + "execute_choice_from_list", + "execute_choice_from_menu", + "find_default_button", + "get_context", + "get_current_element", + "goto_next_element", + "goto_previous_element", + "list_snapshots", + "wait_for_closing" +] - added
Input schema / properties / include_tablesAdded value: +{ + "default": null, + "title": "Include Tables", + "type": "boolean" +} - added
Input schema / properties / max_rowsAdded value: +{ + "default": null, + "title": "Max Rows", + "type": "integer" +} - added
Input schema / properties / save_as_snapshotAdded value: +{ + "default": null, + "title": "Save As Snapshot", + "type": "boolean" +} - added
Input schema / properties / snapshot_idAdded value: +{ + "default": null, + "title": "Snapshot Id", + "type": "string" +}
- Changed
tc_session1 field changed- added
Input schema / properties / desktopAdded value: +{ + "default": null, + "enum": [ + "default", + "isolated" + ], + "title": "Desktop", + "type": "string" +}
- Changed
tc_table4 fields changed- added
Input schema / $defsAdded value: +{ + "CellEntry": { + "additionalProperties": false, + "properties": { + "column": { + "title": "Column", + "type": "string" + }, + "text": { + "title": "Text", + "type": "string" + } + }, + "required": [ + "column", + "text" + ], + "title": "CellEntry", + "type": "object" + }, + "CheckCellEntry": { + "additionalProperties": false, + "properties": { + "checked": { + "title": "Checked", + "type": "boolean" + }, + "column": { + "title": "Column", + "type": "string" + } + }, + "required": [ + "column", + "checked" + ], + "title": "CheckCellEntry", + "type": "object" + }, + "RowEntry": { + "additionalProperties": false, + "properties": { + "cells": { + "items": { + "anyOf": [ + { + "$ref": "#/$defs/CellEntry" + }, + { + "$ref": "#/$defs/CheckCellEntry" + } + ] + }, + "maxItems": 100, + "minItems": 1, + "title": "Cells", + "type": "array" + } + }, + "required": [ + "cells" + ], + "title": "RowEntry", + "type": "object" + } +} - changed
Input schema / properties / action / enumPrevious value: -[ - "can_be_expanded", - "change_row", - "choose_row", - "collapse", - "copy_row", - "delete_row", - "deselect_all_rows", - "deselect_row", - "end_edit_row", - "expand", - "get_cell_text", - "get_current_item", - "get_current_row", - "get_selected_rows", - "go_one_level_down", - "go_one_level_up", - "goto_first_row", - "goto_last_row", - "goto_next_item", - "goto_next_row", - "goto_previous_item", - "goto_previous_row", - "goto_row", - "is_expanded", - "read_rows", - "select_all_rows", - "select_row", - "set_cell_text", - "set_order", - "switch_row_delete_mark", - "table_add_row" -]New value: +[ + "add_rows", + "can_be_expanded", + "change_row", + "choose_row", + "collapse", + "copy_row", + "delete_row", + "deselect_all_rows", + "deselect_row", + "end_edit_row", + "expand", + "get_cell_text", + "get_current_item", + "get_current_row", + "get_selected_rows", + "go_one_level_down", + "go_one_level_up", + "goto_first_row", + "goto_last_row", + "goto_next_item", + "goto_next_row", + "goto_previous_item", + "goto_previous_row", + "goto_row", + "is_expanded", + "read_rows", + "select_all_rows", + "select_row", + "set_cell_text", + "set_order", + "set_row_values", + "switch_row_delete_mark", + "table_add_row" +] - added
Input schema / properties / cellsAdded value: +{ + "default": null, + "items": { + "anyOf": [ + { + "$ref": "#/$defs/CellEntry" + }, + { + "$ref": "#/$defs/CheckCellEntry" + } + ] + }, + "maxItems": 100, + "minItems": 1, + "title": "Cells", + "type": "array" +} - added
Input schema / properties / rowsAdded value: +{ + "default": null, + "items": { + "$ref": "#/$defs/RowEntry" + }, + "maxItems": 100, + "minItems": 1, + "title": "Rows", + "type": "array" +}
1 tool update
v1.0.2- Changed
tc_table2 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "can_be_expanded", - "change_row", - "choose_row", - "collapse", - "copy_row", - "delete_row", - "deselect_all_rows", - "deselect_row", - "end_edit_row", - "expand", - "get_cell_text", - "get_current_item", - "get_current_row", - "get_selected_rows", - "go_one_level_down", - "go_one_level_up", - "goto_first_row", - "goto_last_row", - "goto_next_item", - "goto_next_row", - "goto_previous_item", - "goto_previous_row", - "goto_row", - "is_expanded", - "select_all_rows", - "select_row", - "set_cell_text", - "set_order", - "switch_row_delete_mark", - "table_add_row" -]New value: +[ + "can_be_expanded", + "change_row", + "choose_row", + "collapse", + "copy_row", + "delete_row", + "deselect_all_rows", + "deselect_row", + "end_edit_row", + "expand", + "get_cell_text", + "get_current_item", + "get_current_row", + "get_selected_rows", + "go_one_level_down", + "go_one_level_up", + "goto_first_row", + "goto_last_row", + "goto_next_item", + "goto_next_row", + "goto_previous_item", + "goto_previous_row", + "goto_row", + "is_expanded", + "read_rows", + "select_all_rows", + "select_row", + "set_cell_text", + "set_order", + "switch_row_delete_mark", + "table_add_row" +] - added
Input schema / properties / max_rowsAdded value: +{ + "default": null, + "title": "Max Rows", + "type": "integer" +}
10 tool updates
v1.0.0- First observed
tc_app - First observed
tc_calendar - First observed
tc_doc - First observed
tc_field - First observed
tc_find - First observed
tc_form - First observed
tc_scenario - First observed
tc_session - First observed
tc_table - First observed
tc_window
TDQS
Scored across 10 tools
Top-level tools are split by domain (session, app, window, field, table, form, etc.), but several overlap in practice: tc_table and tc_field both edit table cells, tc_app and tc_window both expose window state, and tc_form, tc_app, and tc_find all provide element discovery or reading. An agent can often distinguish them, but there are enough cross-cutting concerns to cause misselection.
All 10 tools use a consistent tc_<noun> pattern in snake_case, making the set highly predictable. Action names within each group are also uniformly snake_case and descriptive, even when they use varied phrasing.
10 tools is well within the ideal 3–15 range and each tool maps to a distinct functional area of the 1C test client. The grouping is logical, even though individual tools contain many actions.
The surface covers a broad UI automation lifecycle: connection/launch, window and form state, field and table editing, documents, calendars, scenarios, and object finding. Minor gaps may exist, such as explicit document-saving operations, but the core workflows are well represented.
Maintenance
Related MCP Connectors
Drive real devices from your AI Coding tool. Embed a client SDK (Unity, Godot, Flutter, iOS/macOS, Android, React Native, Web) in your app, then capture screenshots, traverse the UI tree, inject taps and key events, and run automated test tasks on the physical device over a secure relay.
- mcp-serverOAuthcom.make
Give your AI agents the tools to build, manage, and run automation workflows.
Connect any AI agent to 1,000+ apps and 27,000+ actions through one remote MCP server (OAuth).
One connector for 15,000+ MCP servers plus your team's private MCPs, from any AI client.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to interact with 1C:Enterprise databases through natural language, providing metadata retrieval, configuration analysis, and code generation.9-
- AlicenseNot gradedqualityBmaintenanceIntegrates AI agents with 1C:Enterprise databases via MCP and REST API, supporting a built-in HTTP server (no Python required) or a Python proxy mode.279GPL 3.0
- FlicenseAqualityDmaintenanceEnables AI agents to interact with 1С:Enterprise and BAS ERP systems through REST and HTTP services, providing tools for searching catalogs, creating documents, and querying stock balances.6-
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to interact with 1C: Enterprise development environment, including running tests, managing launch profiles, building configurations, and performing database operations through the 1C: Platform Tools extension.38MIT