FreeCAD MCP
This server automates FreeCAD modeling, scripting, FEM, and verifiable assembly work.
Create, list, reload, and inspect FreeCAD documents, including save/recompute status.
Create, edit, and delete objects, including Part/PartDesign and supported Draft/FEM types.
Run Python synchronously, as background jobs, or in headless
freecadcmd; poll async jobs.Capture screenshots, focused multi-view images, and insert parts from the parts library.
Run CalculiX FEM analyses and return stress/displacement summaries.
Inspect world-space geometry and define mounting faces plus ordered hole interfaces.
Plan and preview alignments without modifying the document.
Apply alignments transactionally with rollback and independently verify hole errors, axes, gap, and scoped collisions.
Submit, poll, and cancel long native assembly jobs with request-id idempotency.
Create native assemblies and persistent Fixed Joints with solver and numeric checks.
Query assembly capabilities and RPC/addon health.
Provides tools for interacting with FreeCAD to inspect parts, define mounting interfaces, plan and preview alignments, apply positioning and recompute geometry, verify assembly results, create native assemblies with fixed joints, and capture inspection images. Supports queued CAD operations, job tracking, cancellation, and document status checks.
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., "@FreeCAD MCPalign the mounting bracket to the base plate and verify the assembly"
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.
FreeCAD MCP: сборка с проверкой результата
Fork neka-nat/freecad-mcp (MIT) для агентов, которые собирают реальные механические узлы.
Upstream позволяет агенту сделать что-то в FreeCAD. Этот fork позволяет агенту доказать, что деталь встала правильно: числами, а не фразой «скрипт выполнен».

В чём разница
Возьмём типичную задачу: прикрутить кронштейн к основанию по двум отверстиям.
В upstream агент сам пишет Python: ищет грани, переводит координаты в мировые, считает Placement, применяет его. Затем получает «скрипт выполнен» и один скриншот. Если отверстия не совпали на 0,3 мм, это видно только на глаз.
execute_code(<свой скрипт: найти грани → посчитать Placement → применить>)
→ "Script executed successfully"
get_view() → одна картинка с одного ракурсаВ этом fork то же самое — это готовые операции с измерениями и откатом:
define_interface(основание) define_interface(кронштейн) # какая грань, какие отверстия
plan_alignment(...) # план без изменения документа
preview_alignment(plan_id) # голубая деталь в предлагаемом положении, 3 ракурса
apply_alignment(plan_id) # перемещение в транзакции; при нарушении допуска — откат
check_assembly(plan_id) # независимая повторная проверка
inspect_region(...) # изометрия + сверху + справа одним ответомРезультат — измерения, а не «успех»:
passed: true
max_hole_error_mm: 6.2e-14 hole_axis_angles_deg: [0.0, 0.0]
gap_mm: 3.6e-14 opposing_faces_error_deg: 0.0
collisions: [{part: "Base", overlap_mm3: 0.0}]
collision_scope: ["Base"] whole_assembly_checked: falseЭто вывод реального запуска (FreeCAD 1.1.4, аддон 0.2.1): два бруска 40×24×6 мм с двумя отверстиями, кронштейн изначально смещён и повёрнут. Значения порядка 1e-14 мм — шум вычислений с плавающей точкой, то есть отверстия совпали точно. Анимация выше снята на этой же сцене.
Сравнение
Сравнение относится к взятой за основу версии upstream 0.1.28 (коммит 8babe992); с тех пор в upstream новых коммитов нет. Возможность написать собственный Python-код сохранена, отличие fork — готовые операции с общими правилами проверки и ошибок.
Задача | upstream | этот fork |
Количество инструментов | 17 | 32: те же 17 + 14 инструментов сборки/статуса и конвертация STL в BREP |
Найти геометрию крепления | Объекты, свойства и скрипты агента |
|
Подготовить перемещение | Агент рассчитывает и задаёт Placement |
|
Подтвердить результат | Успех скрипта и то, что агент отдельно запросил | Ошибки отверстий, углы осей, зазор и объёмы пересечения с указанными деталями |
Неудачное совмещение | Транзакцию и откат нужно писать в скрипте |
|
Увидеть сборку |
|
|
Долгая операция и таймаут |
| Задания: |
Не устарел ли план | Агент проверяет сам | Отпечатки геометрии, счётчик изменений, идентичность документа: устаревший план отклоняется |
Закрепить связь деталей | Assembly API вручную через Python |
|
Что не сохранено |
|
|
Что не изменилось
Все 17 исходных инструментов, аддон, headless-исполнение, FEM, история коммитов и авторство upstream сохранены. Fork — надмножество: всё, что умел upstream, работает как раньше. Новые операции требуют нашего аддона 0.2.1; со старым аддоном возможен лишь ограниченный режим (см. Быстрый запуск). Документация upstream: UPSTREAM_README.
Что изменено в аддоне
Аддон работает внутри FreeCAD и выполняет то, что просит MCP-сервер. Новые инструменты сборки возможны только благодаря ему: без аддона 0.2.1 они недоступны.
Часть аддона | upstream 0.1.28 | этот fork |
Прежний RPC-код | Управление документами, объектами, скриптами, скриншотами | Почти не тронут (+45 строк): добавлены вызовы нового API и статус документов |
| Нет | Геометрия сборки: поиск граней и отверстий, расчёт перемещения, замеры, откат при нарушении допуска, предпросмотр, Fixed Joint |
| Нет | Очередь долгих операций: защита от повторного запуска по |
| Нет | Счётчик изменений документа: план отклоняется, если модель изменилась после его построения |
| Нет | Статус сохранения: GUI-флаг изменений, наличие файла, пересчёт |
Установка | Копирование папки вручную |
|
Раньше такую логику агент писал скриптом в каждом диалоге и мог ошибиться. Теперь это готовый код внутри FreeCAD, который покрыт тестами и live smoke. Для рисования деталей, FEM и обычных скриптов поведение аддона не изменилось. Проверки выполнены на наших тестах и сценариях, а не на произвольных CAD-моделях.
Когда достаточно upstream
Если вы рисуете детали, редактируете объекты, гоняете FEM или генерируете модели скриптами, а не совмещаете готовые детали по крепёжным отверстиям, новые инструменты вам не нужны: upstream проще и ставится быстрее. Fork нужен, когда важно проверяемо состыковать детали и знать, что именно проверено.
Related MCP server: CadKitty
Зачем появился fork
Задача проекта — помогать агенту собирать реальные механические узлы для подставки androsaur-stand: совмещать крепёжные отверстия основания и кронштейна с заданным зазором. Upstream дал рабочую основу: управление FreeCAD, создание и редактирование объектов, скрипты, скриншоты, фоновые задания, headless и FEM. В нашей работе проявились три ограничения.
Успех скрипта не равен правильной сборке. Агент сам писал код поиска граней, перевода координат и проверки; Python выполнялся, а детали оставались смещены. После правок снова требовались замеры и итерации.
Один скриншот не подтверждает соосность. По общей изометрии трудно увидеть совпадение отверстий, контакт плоскостей или малый зазор.
Неясно, что после таймаута. Можно ли повторить перемещение, актуален ли план, какие документы не сохранены — отдельные скрипты в каждом диалоге.
Цикл «план → предпросмотр → применение с откатом → измерение → несколько ракурсов» делает условия успеха явными и даёт агенту данные для следующего решения. Он призван сократить число исправлений на глаз; отдельного сравнительного измерения скорости или числа итераций мы пока не проводили.
Что подтверждено и где остаются ограничения
Версия 0.2.1: 286 тестов проходят (проверено запуском uv run pytest), на MCP SDK
1.x и 2.x; CI также проверяет Python 3.12 и 3.13. Live smoke в FreeCAD проверяет
вложенные Placement, PartDesign Body, откат при коллизии и отмене, предпросмотр, а также
Fixed Joint после смещения и после сохранения и повторного открытия FCStd. Это
проверенные сценарии, а не гарантия для произвольной CAD-модели.
Что остаётся за агентом и за границами проверки:
правильно выбрать контактные грани и порядок отверстий (симметрия не угадывается);
коллизии проверяются только с фиксированной деталью и явно указанными
obstacles; в ответе всегдаwhole_assembly_checked: false;нет поддержки
App::Link, перемещения контейнеровApp::Partи редактирования произвольных сетей Assembly-связей.
Полные условия: «Границы проверки».
Автоматическая сшивка STL в BREP
convert_mesh_to_brep превращает STL-файл или объект сетки в отдельное твёрдое
BREP-тело и автоматически восстанавливает настоящие плоскости, цилиндры и
поддержанные частичные дуги. Это изменение геометрии, не визуальное сглаживание;
размеры определяются из STL без исходников OpenSCAD и ручного выбора граней.
Например, платформа наклона из 2884 треугольников восстановлена в 31 грань: 21 плоскость и 10 цилиндрических поверхностей. Все шесть STL контрольного набора проверены одним инструментом, включая сохранение и повторное открытие.
Исходник сохраняется, результат проверяется по валидности, объёму, габаритам и остаточной гранёности. Опциональный ремонт ограничен численным допуском. Параметрическая история не восстанавливается; неподдержанные поверхности могут остаться гранёными. Файл автоматически не сохраняется.
Подробное руководство: STL → BREP — запуск, этапы восстановления, результаты шести деталей, отчёт, проверки и ограничения. Параметры MCP-инструмента.
Быстрый запуск
Требуются Python 3.12+, uv и открытый FreeCAD с запущенным MCP RPC на порту 9875.
uv sync
uv run freecad-mcp --host 127.0.0.1Нужен наш аддон 0.2.1, а не только старый upstream-аддон. Сборочные операции
исполняются через отдельный нативный RPC API; Python-код для них не передаётся.
CAD-ядро имеет один исходник addon/FreeCADMCP/freecad_mcp_core/ и также включено
в MCP wheel. get_assembly_capabilities проверяет независимый assembly-протокол.
Установка с резервной копией предыдущего аддона:
uv run python scripts/install_addon.py --target /absolute/FreeCAD/user/Mod/FreeCADMCPОбычная установка требует перезапуска FreeCAD. Если старый RPC уже работает,
добавьте --activate: установщик проверит отсутствие открытых транзакций и
фоновых работ, заменит обработчики в существующем сервере и проверит протокол.
Документы не закрываются. GUI-диспетчер и очередь сохраняются; обновление самого
диспетчера требует обычного перезапуска. Старый аддон сохраняется вне Mod/.
Для временной совместимости со старым аддоном есть явный --allow-legacy-addon;
в этом режиме доступны операции, доставляемые через execute_code, а нативные
jobs и их гарантии отсутствуют. По умолчанию автоматического fallback нет.
Для новой установки аддона см. исходную инструкцию.
При включённой аутентификации задайте FREECAD_MCP_TOKEN в окружении MCP.
Таймауты
Для долгих операций задайте в MCP-клиенте таймаут вызова не меньше 240 секунд. При
сетевом таймауте состояние операции неизвестно: дождитесь освобождения GUI и проверьте
check_assembly, прежде чем снова перемещать деталь. Таймаут RPC не останавливает
выполняющуюся CAD-операцию.
Какие документы не сохранены
get_document_status() возвращает все открытые документы; doc_name выбирает
один по внутреннему имени. list_documents(include_status=true) даёт тот же
снимок; прежний вызов без аргументов сохраняет список имён.
modified— флагGui.Document.Modified, соответствующий состоянию интерфейса.saved_once— сохранялся ли документ раньше (App.Document.isSaved()).needs_recompute— нужен ли пересчёт (isTouched()), отдельно от сохранения.file_path,file_exists— связанный файл и его наличие на диске.needs_save— true для нового, изменённого документа или отсутствующего файла; null, если состояние Modified не удалось получить для ранее сохранённого файла.
Отсутствие GUI-состояния никогда не трактуется как «сохранён». Новый пустой документ может иметь modified=false, но needs_save=true. App.save()/saveAs() может оставить GUI Modified=true; инструмент честно сообщает флаг интерфейса. GUI-сохранение сбрасывает его. Чтение статуса не сохраняет и не пересчитывает документ. Проверяйте статус перед закрытием или reload документа.
Задания и отмена
Все нативные операции ставятся в GUI-очередь как задания. Обычный инструмент
ждёт до 20 секунд, затем возвращает job_id для get_assembly_job, вместо
продолжения ожидания до таймаута клиента. Задание живёт в аддоне, независимо от
MCP-процесса. Перезапуск FreeCAD или активация нового аддона сбрасывает историю. Для важных долгих операций используйте явный протокол:
start_assembly_operation("apply_alignment", {"plan_id": "..."}, request_id="mount-story-42")
get_assembly_job(job_id)
cancel_assembly_job(job_id)Повтор того же request_id и аргументов возвращает тот же job; другие аргументы
отклоняются. Гарантия действует в пределах истории: 32 завершённых задания + все
активные, не более 8 ожидающих/выполняемых. Не повторяйте запрос после истечения
истории без проверки текущей геометрии. outcome_unknown означает, что GUI
превысил бюджет диспетчера: продолжайте опрашивать исходный job.
Отмена ожидающего job исключает выполнение; отмена уже работающего проверяется между безопасными этапами. Для применения это вызывает откат транзакции. Сам вызов OCCT не прерывается. После начала commit отмена отклоняется. accepted=true означает принятую просьбу — дождитесь конечного состояния job.
Рабочий цикл
inspect_part(doc_name, part)— валидность, габариты, плоские грани, цилиндры, оси и радиусы в мировых координатах, в миллиметрах. Большие детали выдаются страницами по 100 граней каждого типа; следуйте полям next_*_offset.define_interface(doc_name, part, plane_face, hole_faces)— явный интерфейс: контактная плоскость и не менее двух отверстий в заданном порядке.plan_alignment(fixed_interface, moving_interface, obstacles=[...])— план без изменения документа. Порядок отверстий определяет соответствие; симметрию и назначение крепления агент должен разрешить явно.preview_alignment(plan_id)— три PNG с голубой полупрозрачной деталью в предлагаемом положении и осями креплений; документ не меняется.apply_alignment(plan_id)— транзакция, перемещение, recompute, измерения. Ошибка или нарушение допуска вызывает откат. Файл не сохраняется.check_assembly(plan_id)— повторная независимая проверка текущего положения: ошибки отверстий, углы осей, зазор и объёмы пересечений.inspect_region(doc_name, parts=[...])— PNG изометрии, сверху и справа одним ответом с отпечатками геометрии. Камера и видимость восстанавливаются.
Например, две пластинки с двумя отверстиями:
fixed = define_interface("Fixture", "Base", "Face6", ["Face7", "Face8"])
moving = define_interface("Fixture", "Bracket", "Face5", ["Face7", "Face8"])
plan = plan_alignment(fixed.interface_id, moving.interface_id,
gap_mm=0, tolerance_mm=0.01, obstacles=["Motor"])
apply_alignment(plan.plan_id)
check_assembly(plan.plan_id)
inspect_region("Fixture", ["Base", "Bracket", "Motor"])Имена граней в примере условные: их нужно получить через inspect_part.
Противоположные нормали плоскостей задают соприкосновение, положительный зазор
откладывается наружу фиксированной детали. Радиусы могут различаться для
зазорного крепления: совместимость крепежа по диаметрам остаётся отдельной задачей.

Границы проверки
apply_alignmentпозиционирует через Placement. Для постоянной связи естьcreate_assemblyиcreate_fixed_joint: стандартный FreeCAD Fixed Joint + Grounded Joint, штатный solver, транзакция и проверка геометрии после решения. Обе детали должны быть прямыми членами пустой нативной Assembly без других joints.create_assemblyпринимает только корневые детали, сохраняя их положения. После перемещения в Assembly нужно заново определить интерфейсы и план. Коннекторы Fixed Joint сохраняют относительное положение и отвязаны от топологии: изменение геометрии не переопределяет крепление автоматически. Редактирование произвольных существующих сетей constraints пока не поддерживается. apply_alignment отказывается перемещать детали в Assembly с существующими joints, чтобы не нарушать их Placement-изменением.Для проверяемых изменений нужен включённый FreeCAD Undo. Сохранение файла остаётся явным действием; Fixed Joint сохраняется и решается после reopen.
Проверены
Part::Feature, детали во вложенномApp::Partи произвольные повороты. Для PartDesign выбирайте сам Body какpart(проверено live smoke). Применение кApp::Linkи перемещение контейнераApp::Partпока запрещены.Поддерживаются полные цилиндрические внутренние стенки, открывающиеся на выбранную плоскость перпендикулярно ей. Частичные цилиндры, пазы и составные стенки требуют отдельного расширения. Кандидат цилиндра не равен доказанному сквозному отверстию.
Коллизии проверяются только между перемещаемой геометрией, фиксированной деталью и явно перечисленными
obstacles. Ответ всегда содержит область проверки иwhole_assembly_checked: false.Интерфейсы привязаны к отпечатку геометрии и положения. После изменений нужно определить их заново. Аддон наблюдает изменения документа; план устаревает при структурных изменениях, а close/reopen всегда меняет идентичность документа. Видимость и служебный _GroupTouched не считаются изменением геометрии. Идентификаторы живут в FreeCAD: истекают при перезапуске, обновлении runtime или вытеснении из кэша (256 записей каждого типа).
Успешный скрипт и красивый скриншот не доказывают правильность сборки. Агент должен сообщить численный результат и область проверки.
Проверка разработки
uv run pytest -q
uv run python -m compileall -q src addon
uv build
# Отдельный live smoke с открытым FreeCAD / RPC:
uv run python scripts/smoke_mounting.py --native
uv run python scripts/smoke_mounting.py --native --body --assemblyLive smoke создаёт и закрывает только одноразовый документ: два крепления, поворот детали, вложенное размещение, препятствие для проверки отката, контроль повторного применения и устаревших интерфейсов, три PNG. Нативный режим проверяет откат после отмены, ghost preview, а --assembly также штатное решение Fixed Joint после смещения и после сохранения/повторного открытия FCStd. Рабочие детали не меняет.
Available Tools
31 toolsapply_alignmentA
Apply a fresh plan in one FreeCAD transaction. Refuse reused/stale plans.
Recompute and measure actual hole errors, axes, mating gap and scoped intersections.
Roll back placement if any check fails. Does not save files. Moves Part::Feature or
PartDesign Body; App::Link and App::Part container application are unsupported.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | Yes |
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 well: single-transaction semantics, recompute-and-measure checks, rollback on failure, no file save, and supported object types. It stops short of saying how results/failures surface (returned payload vs. thrown error), which matters for a mutation 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?
Front-loaded with the action and constraint, then the behavioral detail grouped sensibly. Dense but every line carries information; minor fragmentation across short lines is the only cost.
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 mutating, no-annotation, no-output-schema tool, the description covers the critical agent questions: transaction scope, validation, rollback, persistence, and supported object types. The remaining gap is what the agent receives on success or check failure.
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% for the single plan_id parameter, so the description must compensate. It does add meaning by tying plan_id to a 'fresh' plan and warning against stale/reused ids, but never states the id format or its origin tool.
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 and resource ('Apply a fresh plan') plus the constraint that the plan must be fresh, which separates it from plan/preview tooling. It does not name the sibling tools (plan_alignment, preview_alignment) that produce those plans, so differentiation is implied rather than explicit.
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 concrete when-not conditions: refuses reused/stale plans and does not support App::Link or App::Part containers. It never explicitly routes the agent to preview_alignment or plan_alignment as the prerequisite step, leaving the workflow relationship to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_assembly_jobA
Cancel queued jobs or request safe-point cancellation with rollback for running mutations.
Running OCCT calls cannot be interrupted. accepted=true is a request, not proof
of cancellation: poll for terminal state. Once committing begins cancellation is refused.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes |
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: it discloses that accepted=true is a request rather than proof of cancellation, that running OCCT calls cannot be interrupted, that cancellation is refused once committing starts, and that rollback semantics apply to running mutations. These are non-obvious operational traits an agent would otherwise get wrong.
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?
Three dense sentences, each carrying distinct information, with the primary action stated first and the caveats after. The line-broken formatting is slightly awkward but nothing is redundant.
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 one-parameter mutation tool with no annotations and no output schema, the description closes the critical gaps: the accepted-not-cancelled contract, the refusal window, and polling for terminal state. Only the source of job_id and any error shape are left unstated.
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 the single parameter job_id is undocumented in both schema and description. The description implies a job identity that distinguishes queued from running work but never says where a job_id comes from or what form it takes.
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 (cancel) and resource (assembly job) and immediately splits into two modes: discarding queued jobs versus safe-point cancellation with rollback for running mutations. It does not name a sibling tool, so the distinction from get_assembly_job / get_async_status must be inferred rather than read.
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 usable conditions: applies to queued jobs and to running mutations via safe-point cancellation, and is refused once committing begins. It stops short of pointing at the follow-up tool for polling terminal state, leaving the agent to guess among the many get_* siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_assemblyA
Measure current geometry against a plan, without moving it; reports passed=false on failure.
This checks only declared interface geometry and collision scope, not every assembly component, topology intent, mechanical strength, or persistent assembly constraints.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It clearly states the operation is non-mutating ("without moving it"), reports passed=false on failure, and limits its own scope, though it does not describe success output, synchronous behavior, or plan prerequisites.
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 definition is front-loaded with the core action and key behavioral constraint, followed by a compact scope disclaimer. Both sentences earn their place and there is no redundant wording.
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?
The description covers purpose, non-mutation, failure signaling, and scope limits, which is adequate for a simple one-parameter check tool. It still leaves gaps around how plan_id is sourced and what a successful result contains, with no output schema to compensate.
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?
The schema has 0% description coverage for the single required parameter, plan_id. The description only refers to "a plan" and does not explain the expected identifier format, where to obtain it, or whether the plan must already exist.
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 a specific verb and resource: measure current geometry against a plan. The phrase "without moving it" distinguishes it from mutating assembly operations such as apply_alignment, though it does not explicitly name any sibling 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 second sentence gives useful scope exclusions, making clear what this tool does not validate. However, it does not explicitly say when to choose check_assembly over siblings like preview_alignment, plan_alignment, or get_assembly_job.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_assemblyB
Create a native FreeCAD Assembly containing specified ROOT parts, preserving world poses.
Changes document organization in one transaction. Refuses parts already inside containers. Creates the native joint group. Does not save files.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Assembly | |
| parts | Yes | ||
| doc_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the load and does reasonably well: it discloses atomicity ('one transaction'), a side effect ('Creates the native joint group'), a hard failure condition ('Refuses parts already inside containers'), and non-persistence ('Does not save files'). It stops short of stating required permissions, what is returned, or what happens to the document on failure.
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?
Four short sentences, front-loaded with the core action and followed by constraints, with no filler. The telegraphic style borders on clipped but every sentence carries 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?
No output schema and no annotations, so the description must cover both behavior and parameters; it covers behavior well but leaves all three parameters undocumented, including format expectations for doc_name and the parts list. Adequate for the mutation semantics, incomplete for invocation details.
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 the description only touches one parameter indirectly by qualifying parts as 'ROOT parts'. The required doc_name and the optional name (default 'Assembly') are left completely unexplained, so an agent has to infer their meaning from the field names alone.
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 and resource ('Create a native FreeCAD Assembly') plus scope ('containing specified ROOT parts, preserving world poses'), which separates it from siblings like create_document or create_fixed_joint. It does not explicitly name a sibling it replaces, but the purpose is unambiguous.
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 a precondition/exclusion ('Refuses parts already inside containers') and a scope limit ('Does not save files'), which are genuinely useful usage signals. However, it never says when to prefer this over alternatives such as create_fixed_joint or create_document, so the routing guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_documentB
Create a new document in FreeCAD.
Args:
name: The name of the document to create.
Returns:
A message indicating the success or failure of the document creation.
Examples:
If you want to create a document named "MyDocument", you can use the following data.
```json
{
"name": "MyDocument"
}
```
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states a return message indicating success or failure, which is a behavioral trait. However, it does not disclose potential side effects like whether the document becomes active, what happens if the name already exists, or any permissions required. No annotations are present, so the description carries full burden and only partially meets it.
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 well-structured with clear Args, Returns, and Examples sections. It front-loads the purpose and provides an example without excessive verbosity. The example section is somewhat redundant but adds practical value for the agent.
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 simple one-parameter creation tool, the description is adequate but lacks detail on error handling, naming rules, or interaction with other FreeCAD elements. It does not mention uniqueness or whether the document becomes active, which are important for an agent. The absence of output schema makes it sufficient but not complete.
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?
The description adds a brief explanation of the 'name' parameter and provides a concrete JSON example, which compensates for the lack of schema descriptions. However, it does not specify constraints like uniqueness, allowed characters, or length limits. The example is helpful but limited.
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 clearly states 'Create a new document in FreeCAD,' which uses a specific verb and resource. This distinguishes it from sibling tools like 'create_object' which creates objects within a document. The purpose is unambiguous and immediately understandable.
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?
No guidance is provided on when to use this tool versus alternatives. The description gives no context about document hierarchy or when one might prefer creating an object instead. The example is illustrative but does not clarify usage conditions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_fixed_jointA
Persist verified mounting pose as a native Fixed Joint, grounding the fixed part.
Requires an applied, still-valid plan and both owners directly inside an existing native Assembly with no prior joints. Runs solver then numeric/collision checks; rolls back if they fail. Native joint survives saving/reopening; connectors preserve relative pose, detached from face topology. This is not a general constraint-network editor.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | Yes | ||
| joint_name | No | MountingJoint | |
| assembly_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does so well: it discloses persistence as a native joint, grounding of the fixed part, solver and numeric/collision validation, rollback on failure, and survival across save/reopen. It does not cover permissions or return/error details, but it is unusually behavior-rich for an unannotated mutation 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 front-loaded with the action and is composed of four dense sentences with no filler. It is concise and structured, though the domain jargon makes it slightly harder to parse than ideal.
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 mutation tool with no annotations, no output schema, and 0% schema description coverage, the description covers prerequisites and transactional behavior but omits parameter meanings and does not state what a successful call returns. It is adequate but leaves clear gaps for an agent trying to invoke it correctly.
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 the description does not explain plan_id, assembly_name, or the joint_name default. It only alludes to a 'plan' and an 'Assembly' conceptually, which does not compensate for the undocumented 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 a specific verb and resource: persist a verified mounting pose as a native Fixed Joint, grounding the fixed part. It also distinguishes the tool from a general constraint-network editor, though it does not name the sibling alignment or assembly tools it depends on.
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 clearly states prerequisites: an applied, still-valid plan and both owners inside an existing native Assembly with no prior joints. It also gives an exclusion (not a general constraint editor), but it does not explicitly name which sibling produces the required plan or compare itself with preview/apply alignment tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_objectA
Create a new object in FreeCAD.
``obj_type`` must name a type registered in FreeCAD's C++ type system, such
as "Part::", "PartDesign::" or "Fem::" types. A number of FreeCAD features
are implemented in Python rather than C++ and so are not registered types;
of those, these are supported here through dedicated factories, and each
requires the properties listed beside it:
Part::Tube InnerRadius, OuterRadius, Height
Draft::Circle Radius
Draft::Rectangle Length, Height
Draft::Polygon FacesNumber, Radius
Draft::Wire Points (list of {x, y, z}), optional Closed
Any other Python-implemented type (Draft::Point, Draft::Ellipse, ...) must
be built with ``execute_code`` instead.
Note that the Draft factories name objects themselves, so for those the
returned object_name will differ from the requested obj_name, which is
applied to the object's Label instead. Always use the returned name in
later get_object/edit_object calls.
Args:
doc_name: The name of the document to create the object in.
obj_type: The type of the object to create (e.g. 'Part::Box', 'Part::Cylinder', 'Part::Cut', 'PartDesign::Body', etc.).
obj_name: The name of the object to create.
obj_properties: The properties of the object to create.
include_screenshot: Whether to return a screenshot of the model (default True).
Set to False to save tokens when visual feedback is not needed,
e.g. for intermediate steps in a longer sequence of changes.
view_name: The view orientation of the returned screenshot (default "Isometric").
Pick the view that best shows the change being made.
Returns:
A message indicating the success or failure of the object creation and a screenshot of the object.
Examples:
If you want to create a cylinder with a height of 30 and a radius of 10, you can use the following data.
```json
{
"doc_name": "MyCylinder",
"obj_name": "Cylinder",
"obj_type": "Part::Cylinder",
"obj_properties": {
"Height": 30,
"Radius": 10,
"Placement": {
"Base": {
"x": 10,
"y": 10,
"z": 0
},
"Rotation": {
"Axis": {
"x": 0,
"y": 0,
"z": 1
},
"Angle": 45
}
},
"ViewObject": {
"ShapeColor": [0.5, 0.5, 0.5, 1.0]
}
}
}
```
If you want to cut one solid out of another, create both solids first,
then reference them by name as 'Base' and 'Tool'.
```json
{
"doc_name": "MyPart",
"obj_name": "Cut",
"obj_type": "Part::Cut",
"obj_properties": {
"Base": "Box",
"Tool": "Cylinder"
}
}
```
If you want to create a pipe with an outer diameter of 250, a 10 wall
and a length of 500, you can use the following data.
```json
{
"doc_name": "MyPipe",
"obj_name": "Pipe",
"obj_type": "Part::Tube",
"obj_properties": {
"OuterRadius": 125,
"InnerRadius": 115,
"Height": 500
}
}
```
If you want to create a FEM analysis, you can use the following data.
```json
{
"doc_name": "MyFEMAnalysis",
"obj_name": "FemAnalysis",
"obj_type": "Fem::AnalysisPython",
}
```
If you want to create a FEM constraint, you can use the following data.
```json
{
"doc_name": "MyFEMConstraint",
"obj_name": "FemConstraint",
"obj_type": "Fem::ConstraintFixed",
"analysis_name": "MyFEMAnalysis",
"obj_properties": {
"References": [
{
"object_name": "MyObject",
"face": "Face1"
}
]
}
}
```
If you want to create a FEM mechanical material, you can use the following data.
```json
{
"doc_name": "MyFEMAnalysis",
"obj_name": "FemMechanicalMaterial",
"obj_type": "Fem::MaterialCommon",
"analysis_name": "MyFEMAnalysis",
"obj_properties": {
"Material": {
"Name": "MyMaterial",
"Density": "7900 kg/m^3",
"YoungModulus": "210 GPa",
"PoissonRatio": 0.3
}
}
}
```
If you want to create a FEM mesh, you can use the following data.
The `Shape` property is required (legacy `Part` is also accepted).
On FreeCAD 1.x the size limits are `CharacteristicLengthMax/Min`;
the legacy `ElementSizeMax/Min` keys are also accepted.
```json
{
"doc_name": "MyFEMMesh",
"obj_name": "FemMesh",
"obj_type": "Fem::FemMeshGmsh",
"analysis_name": "MyFEMAnalysis",
"obj_properties": {
"Shape": "MyObject",
"CharacteristicLengthMax": 10,
"CharacteristicLengthMin": 0.1
}
}
```
| Name | Required | Description | Default |
|---|---|---|---|
| doc_name | Yes | ||
| obj_name | Yes | ||
| obj_type | Yes | ||
| view_name | No | Isometric | |
| analysis_name | No | ||
| obj_properties | No | ||
| include_screenshot | 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 discloses important behavior: it returns success/failure plus a screenshot, include_screenshot defaults to True but can be disabled to save tokens, and Draft factories may return a different object_name than requested. It does not mention permission requirements or detailed failure modes.
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 it is front-loaded with the core purpose and constraints, and the many examples add real value for a tool with a complex, loosely typed obj_properties parameter. Some example material could be trimmed, but most of it earns its 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?
For a high-complexity creation tool with nested objects, 0% schema description coverage, and no output schema, the description is substantially complete: it covers the type system, supported factories, returns, screenshots, and many examples. The main gaps are the undocumented analysis_name parameter and missing prerequisite details such as whether the document must already exist.
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. Its Args section documents doc_name, obj_type, obj_name, obj_properties, include_screenshot, and view_name, and examples richly illustrate obj_properties; however, analysis_name is only shown in examples and is not documented in Args.
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 begins with a precise verb and resource: 'Create a new object in FreeCAD.' It also explains the type constraints and explicitly distinguishes supported C++/Python-factory object types from unsupported Python types that must use execute_code.
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 clear usage boundaries: which obj_type values are supported, which Python types require execute_code, and how to create dependent objects like Part::Cut after creating Base and Tool. It does not explicitly state document-existence prerequisites or when to prefer edit_object over create_object.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
define_interfaceB
Define a mounting interface: planar mating face and >=2 ordered full inner cylinders.
Hole order determines correspondence, including symmetric patterns. Cylinders must
open onto the plane and be perpendicular to it. owner defaults to part; for a
feature inside a PartDesign Body, supply the Body name. No document changes.
| Name | Required | Description | Default |
|---|---|---|---|
| part | Yes | ||
| owner | No | ||
| doc_name | Yes | ||
| hole_faces | Yes | ||
| plane_face | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the one explicit behavioral claim is 'No document changes,' which correctly signals a non-mutating operation, plus the disclosure that hole order carries correspondence semantics including symmetric patterns. It does not explain what the tool produces or where the interface is stored, leaving the agent unsure of the result of a successful call.
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?
Three short sentences, front-loaded with the core definition before constraints and the owner default; every sentence carries information. The terseness borders on cryptic jargon ('full inner cylinders') but nothing is wasted.
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 five-parameter, unannotated, no-output-schema geometry tool, the description covers the correctness-critical geometry and ordering rules but omits two parameters entirely and says nothing about what the call yields. An agent can probably construct a valid call but cannot predict the outcome.
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 partially does: plane_face is the planar mating face, hole_faces is the ordered cylinder list with order-defined correspondence, and owner has a default plus a Body-name rule. doc_name and part are never mentioned, and no format hints (face reference syntax) are given for the string 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?
States a specific verb ('Define') and resource ('mounting interface') and describes exactly what constitutes the definition: a planar mating face plus two or more ordered full inner cylinders. It is clearly distinct from the sibling tools (assembly/job/object tools), though it never says what the definition is used for downstream.
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?
Provides preconditions rather than routing: cylinders must open onto the plane and be perpendicular, and the 'owner defaults to part' rule with the PartDesign Body case is useful context. It never says when an agent should call this versus other part/assembly tools, but no obvious sibling alternative exists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_objectA
Delete an object in FreeCAD.
Args:
doc_name: The name of the document to delete the object from.
obj_name: The name of the object to delete.
include_screenshot: Whether to return a screenshot of the model (default True).
Set to False to save tokens when visual feedback is not needed,
e.g. for intermediate steps in a longer sequence of changes.
view_name: The view orientation of the returned screenshot (default "Isometric").
Pick the view that best shows the change being made.
Returns:
A message indicating the success or failure of the object deletion and a screenshot of the object.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_name | Yes | ||
| obj_name | Yes | ||
| view_name | No | Isometric | |
| include_screenshot | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description mentions that it returns a message and screenshot, and that include_screenshot can be set to False for cost savings. It does not disclose whether the deletion is permanent, irreversible, or if there are any side effects (e.g., cascading deletions) beyond the declared return. With no annotations provided, the description carries the full burden, and while it adds some transparency (screenshot behavior), it lacks details on deletion semantics.
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 compact and well-structured: a one-line purpose, clear parameter explanations, and a return statement. Every sentence adds value: explaining the screenshot flag and view orientation selection. No redundancy or fluff.
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 the tool's complexity (4 params, no output schema, no annotations), the description provides adequate coverage: it explains all parameters, gives guidance on usage (screenshot for intermediate steps), and states the return. It lacks explicit mention of error conditions or effects of deletion, but for a simple mutation tool, this is reasonably complete. No output schema means description must convey return, which it does.
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. It explains doc_name and obj_name (identifying the target), and explains include_screenshot and view_name with their defaults and purpose. However, it doesn't provide additional syntax constraints or examples beyond what the schema already shows (defaults, enums). It does add meaningful context (screenshot token saving logic), which is helpful, but not exhaustive.
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 clearly states 'Delete an object in FreeCAD' with specific verb (delete) and resource (object in a document). It distinguishes from siblings like edit_object or create_object. However, it could be more explicit that it deletes from a specific document and that deletion is permanent, but the core purpose is clear.
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 provides context on when to use include_screenshot (e.g., for intermediate steps) and when to set it to False to save tokens. It doesn't explicitly exclude alternatives or mention when not to use, but it implies usage context. No direct comparison to sibling tools like edit_object or get_object, but it does give practical guidance on one parameter.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_objectA
Edit an object in FreeCAD.
This tool is used when the create_object tool cannot handle the object creation.
Args:
doc_name: The name of the document to edit the object in.
obj_name: The name of the object to edit.
obj_properties: The properties of the object to edit.
include_screenshot: Whether to return a screenshot of the model (default True).
Set to False to save tokens when visual feedback is not needed,
e.g. for intermediate steps in a longer sequence of changes.
view_name: The view orientation of the returned screenshot (default "Isometric").
Pick the view that best shows the change being made.
Returns:
A message indicating the success or failure of the object editing and a screenshot of the object.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_name | Yes | ||
| obj_name | Yes | ||
| view_name | No | Isometric | |
| obj_properties | Yes | ||
| include_screenshot | 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 burden. It discloses that it returns a message and screenshot, and gives parameter-specific behavior (including token-saving advice for include_screenshot). However, it does not mention any side effects, reversibility, or required permissions for editing an object, which are important for a mutation 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 structured with a purpose statement, usage note, Args list, and Returns section. It is concise yet detailed, with no filler. The token-saving tip adds operational value without unnecessary length.
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 the tool's complexity (5 params, nested obj_properties, enum for view_name, no output schema), the description provides adequate context: all parameters are explained, return type is specified, and usage notes are included. It lacks detailed structure for obj_properties, but that is domain-specific.
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?
The description explains all five parameters in plain language, including defaults and usage guidance (e.g., 'Pick the view that best shows the change being made'). This fully compensates for the 0% schema description coverage.
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 clearly states 'Edit an object in FreeCAD' with a specific verb and resource. It also contrasts with create_object, but the phrase 'cannot handle the object creation' makes the relationship between editing and creating somewhat ambiguous, slightly diminishing sibling 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?
It explicitly states 'This tool is used when the create_object tool cannot handle the object creation' and provides guidance for include_screenshot (set False for intermediate steps to save tokens). No other alternatives are mentioned, but this is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
execute_codeA
Execute arbitrary Python code in FreeCAD.
Args:
code: The Python code to execute.
include_screenshot: Whether to return a screenshot of the model (default True).
Set to False to save tokens when the code does not change the model's
appearance, e.g. analytical or computational scripts whose result is
printed output, or intermediate steps in a longer sequence of changes.
view_name: The view orientation of the returned screenshot (default "Isometric").
Pick the view that best shows the change being made.
timeout: Positive finite seconds for each of the queue and GUI execution
budgets, overriding the 90 s default for this call (capped at 1800).
Raise it for slow work that must
run on the GUI thread, such as importing or exporting a large STEP
assembly. Without it the call reports a timeout while the task keeps
running, and the result is lost even though the work finishes. Prefer
execute_code_async for heavy pure-geometry work that touches neither
the document nor the GUI.
Returns:
A message indicating the success or failure of the code execution, the output of the code execution, and a screenshot of the object.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | ||
| timeout | No | ||
| view_name | No | Isometric | |
| include_screenshot | 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 discloses meaningful behavior: 90-second default budgets, a 1800-second cap, timeout-result loss while the task continues, GUI-thread execution constraints, and the default screenshot behavior. It does not explicitly state that arbitrary code can mutate or destroy document state, which is an important safety caveat for this 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 front-loaded with purpose, then structured into Args and Returns. The extra detail on timeout and screenshots is directly actionable, and no sentence is wasteful.
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?
The description covers all parameters and explains the return value despite there being no output schema, making it largely complete for invocation. However, for a tool that executes arbitrary code, it omits explicit warnings about side effects, permissions, or the distinction from execute_code_headless.
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 documents all four parameters. It explains code, include_screenshot default and token-saving usage, view_name purpose, and timeout semantics including default, cap, budgets, and failure behavior.
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 a specific verb and resource: executing arbitrary Python code inside FreeCAD. It also implicitly differentiates the tool from execute_code_async by recommending that sibling for heavy pure-geometry work, giving an agent enough to distinguish core execution behavior.
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 concrete usage guidance: set include_screenshot to False for token savings, pick the view that best shows the change, raise timeout for slow GUI-thread work, and prefer execute_code_async for heavy pure-geometry work. It does not explicitly compare against execute_code_headless, which is the main gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
execute_code_asyncA
Execute Python code in FreeCAD without waiting for completion.
Use this ONLY for long-running background computations that do NOT touch the
FreeCAD GUI or mutate the FreeCAD document tree directly.
This tool runs the submitted code in a background thread and returns
immediately. Because it does not run on FreeCAD's main GUI thread, the code
must NOT directly call FreeCADGui APIs, manipulate the active view or
selection, create or edit document objects, change object properties, call
doc.recompute(), or save documents. FreeCAD documents and the Coin3D
scenegraph are not thread-safe: writing to them from this thread races the
GUI thread and can wedge FreeCAD's event loop, after which the RPC server
stops responding entirely and FreeCAD must be restarted.
Every document or view write must instead be handed to the GUI thread through
the injected commit() helper:
commit(fn, timeout=120) -> fn's return value
Scripts share a live namespace. Saved functions can use commit() in later
async calls; calling it from execute_code or a GUI callback raises immediately.
Coordinate concurrent scripts that intentionally modify the same variables.
commit() queues fn on the GUI thread, waits for it, and raises RuntimeError if
dispatch fails or times out. Example:
fused = base.fuse(addition).removeSplitter() # slow, safe in background
def apply(): # runs on the GUI thread
obj.Shape = fused
doc.recompute()
commit(apply)
For code that is not dominated by heavy geometry computation, use execute_code
instead. execute_code runs entirely on the FreeCAD GUI thread and is the safe
default for normal FreeCAD automation.
Use execute_code_async only when the heavy part is long-running OCCT geometry
(e.g. fuse/cut/loft on already-fetched shapes) or other CPU-bound computation
that would exceed execute_code's 90 s GUI-thread budget.
Typical usage pattern:
1. Fetch shapes into module-level variables first (via execute_code).
2. Run the heavy computation via execute_code_async.
3. Apply the result inside commit(), or store it in a module-level Python
variable (not in the FreeCAD document) for a later execute_code call.
Performance note: boolean operations against shapes with many faces (e.g. a
ribbed lid) are expensive. Fuse the additions together first, then apply a
single boolean against the heavy shape, and avoid doc.recompute() unless the
dependency graph really needs it.
Args:
code: Background-safe Python code to execute. Use commit(fn) for all
document and view writes.
Returns:
A message with the job_id of the started background execution.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does so thoroughly: it explains the background-thread model, thread-safety hazards, the commit() bridge, shared namespace, RuntimeError behavior, and what happens if the GUI thread is wedged. This is exactly the context an agent needs before invoking a dangerous async 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 tool's danger and complexity. It is front-loaded with the core behavior and constraints, then provides examples and a typical usage pattern without 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?
It thoroughly covers execution semantics, constraints, and the commit() workflow, including the returned job_id. However, it does not mention the sibling get_async_status for polling the started job, nor does it distinguish from execute_code_headless, leaving a small workflow gap for an otherwise complex async 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?
Although schema description coverage is 0% for the single code parameter, the description compensates fully by defining what code is allowed to do, what it must not do, and how document/view writes must use commit(). It also clarifies the return value as a job_id message.
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 a specific verb and resource—execute Python code in FreeCAD—and immediately clarifies the async/background behavior. It explicitly distinguishes this from the safe default execute_code, so an agent can tell the two apart without inspecting schemas.
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 when-to-use and when-not-to-use rules: ONLY for long-running background computations that do not touch the GUI or mutate the document tree. It names execute_code as the alternative for normal automation and describes the narrow condition where execute_code_async is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
execute_code_headlessA
Run a FreeCAD Python script in a separate headless freecadcmd process.
Use this for OCCT work that can crash or block FreeCAD: helical threads
(makeHelix + makePipeShell), lofts and sweeps, booleans with many or
B-spline tools, long parametric rebuilds. A native OpenCascade crash
here only kills the helper process; the GUI and its open documents
survive, and the tool reports the crash signal and the script's output.
The script runs on the MCP server machine, independently of --host, in a
fresh process without GUI: import FreeCAD/Part
yourself, open documents from disk (FreeCAD.openDocument(path)), save
results with doc.save()/saveAs() or Shape.exportBrep(). Nothing from the
execute_code namespace is available. Print progress to stdout; it is
returned when the process ends. After the script saved a .FCStd that is
open in the GUI, call reload_document(doc_name) to show the result.
Args:
code: Complete Python script for freecadcmd.
timeout: Positive finite seconds to wait before killing the process
(default 600). Partial output is preserved on timeout.
Returns:
Exit status, crash/timeout diagnosis and the script's printed output.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | ||
| timeout | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With zero annotations, the description carries the full burden and does it well: crash isolation ('only kills the helper process; the GUI and its open documents survive'), process independence from --host, no GUI, no execute_code namespace, mandatory manual imports, stdout capture, and partial-output preservation on timeout. These are exactly the behavioral facts an agent cannot infer from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with the core definition and then uses a tight Args/Returns block, so structure is strong. It runs slightly long and repeats the isolation idea in two places, but no sentence is 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?
There is no output schema, and the description supplies the return contract (exit status, crash/timeout diagnosis, printed output). Together with the isolation model, import requirements, and the reload_document handoff, an agent has everything needed to invoke it correctly.
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: `code` is specified as a 'complete Python script for freecadcmd' (i.e., stateless, self-contained), and `timeout` is constrained to 'positive finite seconds,' given a default of 600, and its failure mode (partial output preserved) is described.
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 first sentence states a specific verb, resource, and execution context: run a FreeCAD Python script in a separate headless `freecadcmd` process. It also implicitly separates this from the in-process `execute_code` sibling by noting that 'Nothing from the execute_code namespace is available,' so an agent can tell which tool it is looking at.
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?
'Use this for OCCT work that can crash or block FreeCAD' followed by concrete triggers (helical threads, lofts/sweeps, large booleans, long rebuilds) gives the selection criterion directly. It also supplies a required follow-up action: 'After the script saved a .FCStd that is open in the GUI, call reload_document(doc_name).'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_assembly_capabilitiesB
Check native addon protocol and supported assembly operations before working.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, no output schema, and no parameter documentation, the description carries the full behavioral burden and does not meet it. 'Check' weakly implies a read-only operation, but nothing is said about what is returned, whether it can fail, or whether the result should be cached or re-fetched per session.
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?
One short sentence with the action front-loaded and the timing hint trailing it; nothing is redundant. It is arguably too terse rather than too long, but structurally it is clean.
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 zero-param discovery tool with no output schema and no annotations, the description should at minimum characterize the returned capability information so an agent knows how to act on it. It establishes the pre-flight intent but leaves the payoff undefined.
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?
The tool takes zero parameters, so the schema baseline is 4 and there is nothing further for the description to disambiguate. No parameter-level gaps exist.
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 verb/resource pair ('Check' + 'assembly capabilities') indicates a discovery call that returns protocol and operation support, but 'native addon protocol' is jargon and the description never says what a capability report actually contains. It also does not distinguish this from nearby lookalikes such as check_assembly or get_rpc_status.
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?
'before working' implies a call-first sequencing hint, which is genuinely useful for a gating/discovery tool. However, there are no explicit conditions, no statement of when it can be skipped, and no named alternatives among the many assembly siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_assembly_jobA
Poll without waiting for the GUI. Includes durable outcome and native PNGs when done.
outcome_unknown means the GUI exceeded its dispatch budget and may still finish:
continue polling; do not duplicate the mutation. Results last until history eviction
(32 completed jobs) or FreeCAD exit.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | ||
| include_result | 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 does a good job: it discloses the outcome_unknown token and its meaning (GUI exceeded dispatch budget, job may still finish), an idempotency/safety rule (do not re-issue the mutation), and a result-retention policy (until history eviction at 32 completed jobs or FreeCAD exit). It stops short of saying whether the poll itself has side effects or cost, and it never mentions include_result.
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?
Three short, front-loaded segments with no filler: the core action first, then the outcome_unknown caveat, then the retention note. The sentence fragments ('Poll without waiting for the GUI') are slightly clipped but each line earns its 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?
There is no output schema, so the description must cover return semantics, and it partly does (durable outcome, PNGs, outcome_unknown). But for a 2-parameter poll tool it leaves include_result entirely unexplained and does not describe the shape of a non-final response, which is the thing an agent will most often receive.
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 the description never names job_id or include_result. The phrase 'Includes durable outcome and native PNGs when done' hints at what the result payload contains, but it does not tell the agent that include_result toggles that payload, nor what job_id format/lifetime is expected. Two undocumented parameters at 0% coverage with no compensating text is a clear gap.
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 the action ('Poll without waiting for the GUI') and what the tool yields ('durable outcome and native PNGs when done'), which makes it readable as a job-status poll for an assembly job. It does not explicitly name the resource (job) or distinguish itself from siblings like get_rpc_status or get_async_status, so a 4 rather than a 5.
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 a concrete usage rule for the ambiguous case: on outcome_unknown, 'continue polling; do not duplicate the mutation.' That is exactly the guidance an agent needs and it is stated explicitly. It does not, however, contrast this tool with alternative status tools (get_async_status, get_rpc_status), so the alternative-selection dimension is left implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_async_statusA
Report the state of background jobs started by execute_code_async.
Does not use the FreeCAD GUI thread, so it answers even while a job runs.
Args:
job_id: The id returned by execute_code_async. Empty lists all running
jobs and up to 20 recently completed jobs.
Returns:
For one job: its state (running/done/failed), the error and traceback
when it failed. History is held in memory until FreeCAD exits.
| Name | Required | Description | Default |
|---|---|---|---|
| job_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 it well: it discloses that the call bypasses the FreeCAD GUI thread and answers while a job runs, that history lives only in memory until FreeCAD exits, and that failures return an error plus traceback.
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 front-loaded: the purpose and the thread-safety guarantee come first, then Args and Returns. The structure is clean, though the Args/Returns scaffolding is slightly heavier than this one-parameter tool needs.
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 one-parameter read with no output schema, it covers state values (running/done/failed), error/traceback on failure, and history lifetime, which is nearly everything needed. It leaves open how to retrieve a completed job's actual output or result, which is the one gap.
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 does: job_id is defined as the id returned by execute_code_async, and the empty-string default is explained in terms of what is listed rather than just repeating the type.
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 and resource ('Report the state of background jobs') and anchors it to the originating tool (execute_code_async), so an agent can distinguish it from get_rpc_status and get_assembly_job without opening any 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?
The description makes clear this follows execute_code_async and that an empty job_id lists all running plus up to 20 recently completed jobs, which is a concrete usage rule. It does not explicitly exclude cases or name a sibling alternative, keeping it just below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_document_statusA
Read which open documents need saving, without saving or recomputing anything.
Empty doc_name lists all; otherwise inspect one named document. modified is the
GUI dirty flag (same save-state indicator as the UI), saved_once means saved before,
needs_recompute is independent. needs_save is true for new/modified/missing-file
documents; null means the dirty flag could not be read, never assumed clean.
file_path and file_exists identify the associated disk file. App.save()/saveAs()
can leave the GUI modified flag set; this reports the actual GUI flag honestly.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does so well: it explicitly states that the tool only reads, never saves or recomputes, and explains subtle dirty-flag behavior including the null case meaning the flag could not be read rather than assumed clean. It also discloses the App.save()/saveAs() caveat about the GUI modified flag.
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 front-loaded with the core read-only purpose and then explains parameter behavior and return-field semantics compactly. Every sentence earns its place, especially given the absence of an output schema and annotations.
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 are no annotations and no output schema, so the description must explain both behavior and return-field meaning. It does this thoroughly by defining modified, saved_once, needs_recompute, needs_save, file_path, and file_exists, including the important null semantics for needs_save.
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 the lone doc_name parameter. It does so by explaining that an empty string lists all documents and a named value inspects that document, which is the key semantic needed to invoke the tool correctly.
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 a specific verb and resource: read document status for open documents, explicitly without saving or recomputing. It is clear enough to distinguish from mutation tools like create_document or reload_document, though it does not name a sibling alternative such as list_documents.
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 clearly explains the usage split: an empty doc_name lists all documents, while a non-empty value inspects one named document. It does not compare directly against sibling list or inspect tools, but the operational guidance for this tool is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_objectA
Get an object from a document. You can use this tool to get the properties of an object to see what you can check or edit.
Args:
doc_name: The name of the document to get the object from.
obj_name: The name of the object to get.
include_screenshot: Whether to return a screenshot of the document (default True).
Set to False to save tokens when only the object data is needed.
view_name: The view orientation of the returned screenshot (default "Isometric").
Returns:
The object and a screenshot of the object.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_name | Yes | ||
| obj_name | Yes | ||
| view_name | No | Isometric | |
| include_screenshot | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden and does disclose helpful behavioral details: it returns both the object and a screenshot, and explains that include_screenshot=False saves tokens. It does not explicitly say the operation is read-only, but the retrieval semantics and return wording make that a safe inference.
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 compact and well-organized: a clear one-sentence purpose, a practical use statement, an Args section, and a Returns line. There is no unnecessary fluff or repeated schema enums.
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 simple retrieval tool with no output schema and no annotations, the description covers required parameters, optional parameters/defaults, and return shape. It is mostly complete, though it could mention behavior when include_screenshot is false and how the returned object data is structured.
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?
The schema gives 0% parameter descriptions, so the Args section compensates by explaining all four parameters: doc_name, obj_name, include_screenshot, and view_name. It adds useful meaning such as token-saving behavior for include_screenshot and return-screenshot orientation for view_name.
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?
Description clearly states it gets an object from a document and clarifies that this is for inspecting its properties before checking or editing them. This aligns with the sibling set but does not explicitly distinguish it from get_objects or get_view.
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 a clear intended use case: get the properties of an object to see what can be checked or edited. It does not mention exclusions or compare with alternatives, but the context is specific enough to guide basic selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_objectsB
Get all objects in a document. You can use this tool to get the objects in a document to see what you can check or edit.
Args:
doc_name: The name of the document to get the objects from.
include_screenshot: Whether to return a screenshot of the document (default True).
Set to False to save tokens when only the object data is needed.
view_name: The view orientation of the returned screenshot (default "Isometric").
Returns:
A list of objects in the document and a screenshot of the document.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_name | Yes | ||
| view_name | No | Isometric | |
| include_screenshot | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses that include_screenshot defaults to True and can be set to False to save tokens, and that view_name controls the screenshot orientation. However, it doesn't mention any side effects, permissions, or performance implications beyond token usage. It's a read operation implied by 'get', but not explicitly stated as non-destructive.
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 concise and well-structured with an Args/Returns section. It front-loads the purpose and provides practical usage tips. No wasted words, though the Returns section is minimal.
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 the tool's moderate complexity (3 params, 1 required, no output schema), the description covers the basics but lacks detail on return structure, error cases, or how the screenshot relates to the object list. It's adequate for a simple read tool but could be more complete.
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. It explains doc_name, include_screenshot (with token-saving tip), and view_name (orientation). However, it doesn't detail the enum values for view_name beyond the schema, and the return format is only briefly mentioned. The description adds some value but not comprehensive parameter guidance.
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 clearly states the tool's purpose: 'Get all objects in a document' and explains its use case ('to see what you can check or edit'). It distinguishes from sibling tools like get_object (singular) and get_view, though it doesn't explicitly name alternatives. The verb 'get' and resource 'objects in a document' are specific.
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 implies usage: use this to get objects for checking or editing. It doesn't explicitly state when not to use it or mention alternatives like get_object for a single object. The context is clear but lacks exclusions or comparisons to siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_parts_listB
Get the list of parts in the parts library addon.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It only says 'get the list' but doesn't clarify whether this is a read-only operation, what the response format is, or any other behavioral nuances. For a simple list tool this is a notable gap.
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 a single sentence that directly states the tool's purpose. It is front-loaded and contains no unnecessary filler, making it easy for an agent to quickly parse.
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 the zero-parameter nature and simple purpose, the description is minimally viable. However, with no output schema and no annotations, it lacks additional context such as the structure of the returned list or how it relates to sibling tools like insert_part_from_library.
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?
The tool has zero parameters, so the description cannot be expected to explain parameter semantics. The baseline for 0-parameter tools is 4, and the description sufficiently identifies what the list pertains to.
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 clearly states the action ('Get the list') and the resource ('parts in the parts library addon'), making the tool's basic purpose obvious. It does not explicitly distinguish it from siblings like insert_part_from_library, but the distinction is fairly apparent from the descriptions themselves.
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 provides no guidance on when to use this tool versus alternatives. It doesn't mention that it might be a prerequisite for insert_part_from_library or any other usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_rpc_statusA
Get RPC and FreeCAD GUI-dispatch health.
This tool does not use FreeCAD's GUI thread, so it remains available after
a GUI operation times out. A ``stuck`` state identifies the operation that
is still running and indicates that FreeCAD may need to be restarted.
``version_check`` is "ok" or says whether the addon or the server needs
updating.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden, and it does real work: it discloses the non-GUI-thread execution model, the survival-after-timeout property, and the meaning of the 'stuck' state (an operation still running, restart may be needed). It does not explicitly confirm the call is side-effect free or describe the response beyond two 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?
Three short paragraphs, front-loaded with the purpose, then the availability guarantee, then the two return-state semantics. Every sentence adds information an agent would otherwise lack; none is 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 zero-parameter, read-only diagnostic with no output schema, the description covers the essentials: execution model, availability, and the meaning of key status values. It leaves the rest of the response shape undocumented, which is a minor gap given there is no output schema to lean on.
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?
The tool takes zero parameters, so there is nothing for the description to disambiguate. Baseline 4 applies.
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 and resource: 'Get RPC and FreeCAD GUI-dispatch health.' It is clearly a diagnostic/status tool, distinguishable from action siblings like create_object or run_fem_analysis. It stops short of naming the nearest alternatives (get_async_status, get_document_status), so an agent must infer the boundary.
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?
Provides a concrete usage condition: 'This tool does not use FreeCAD's GUI thread, so it remains available after a GUI operation times out.' That tells an agent exactly when to reach for it. It never names an alternative tool or states when not to use it, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_viewB
Get a screenshot of the active view.
Args:
view_name: The name of the view to get the screenshot of.
The following views are available:
- "Isometric"
- "Front"
- "Top"
- "Right"
- "Back"
- "Left"
- "Bottom"
- "Dimetric"
- "Trimetric"
width: The width of the screenshot in pixels. If not specified, uses the viewport width.
height: The height of the screenshot in pixels. If not specified, uses the viewport height.
focus_object: The name of the object to focus on. If not specified, fits all objects in the view.
Returns:
A screenshot of the active view.
| Name | Required | Description | Default |
|---|---|---|---|
| width | No | ||
| height | No | ||
| view_name | Yes | ||
| focus_object | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden. It only states that a screenshot is returned and does not disclose whether the operation is read-only, whether a document must be loaded, what format the screenshot takes, or any side effects or error conditions.
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 well organized with Args and Returns sections and is appropriately concise. The view list is redundant with the schema enum and the final 'Returns' line largely restates the first sentence, but the overall structure is clear and scannable.
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?
The tool has four parameters, no annotations, and no output schema, so the description must carry more weight. It explains parameter defaults well and gives a basic return statement, but it omits the exact output format, prerequisites, and any caveats about view state or object focus behavior.
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?
Although schema description coverage is 0%, the description adds meaningful semantics for all four parameters: view_name lists the valid values, width/height explain default viewport fallback, and focus_object explains the fit-all-objects default. This goes well beyond the raw schema defaults.
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 clearly states 'Get a screenshot of the active view' and enumerates the available standard views, making it distinguishable from sibling get_* tools that return object data. Some ambiguity remains because 'active view' could imply the current viewport while view_name explicitly selects one of the listed views.
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?
There is no explicit guidance on when to use get_view versus alternatives such as get_object or execute_code. The purpose is implied by the verb and parameter descriptions, but no prerequisites, exclusions, or sibling comparisons are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
insert_part_from_libraryA
Insert a part from the parts library addon.
Args:
relative_path: The relative path of the part to insert.
include_screenshot: Whether to return a screenshot of the model (default True).
Set to False to save tokens when visual feedback is not needed,
e.g. for intermediate steps in a longer sequence of changes.
view_name: The view orientation of the returned screenshot (default "Isometric").
Pick the view that best shows the change being made.
Returns:
A message indicating the success or failure of the part insertion and a screenshot of the object.
| Name | Required | Description | Default |
|---|---|---|---|
| view_name | No | Isometric | |
| relative_path | Yes | ||
| include_screenshot | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the return behavior (message plus screenshot) and the token-saving rationale for include_screenshot=False. However, it does not explicitly state side effects on the current document, failure conditions beyond a generic message, or path-resolution context.
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 well-structured with a one-sentence purpose, an Args section, and a Returns section. Every sentence adds useful information, and the guidance about saving tokens is valuable without being verbose.
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 the tool's low complexity, no annotations, and no output schema, the description covers the essential invocation details: path, screenshot toggle, view selection, and return value. It could be more complete by clarifying what 'insert' modifies and where relative_path resolves, but it is otherwise adequate for an agent to invoke the 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%, so the description must compensate. It explains all three parameters, including defaults and usage guidance for include_screenshot and view_name. The main gap is relative_path: it says 'relative path' but does not specify relative to what directory or library root.
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 opens with a specific verb and resource: 'Insert a part from the parts library addon.' This clearly distinguishes it from siblings like create_object or edit_object, and the tool name reinforces the library-source scope.
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 clear context for the tool's main use and provides practical guidance for include_screenshot and view_name. However, it does not explicitly state when to prefer this tool over alternatives such as create_object, nor does it mention exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_partA
Inspect world-space valid geometry, planar faces and cylindrical hole candidates.
Start here before assembly work. Face names are temporary references; define_interface
binds them to geometry fingerprints. Does not move parts or change the camera.
Faces are paginated (1..500 per type); follow next_plane_offset/next_cylinder_offset
when present. feature_counts gives full totals.
| Name | Required | Description | Default |
|---|---|---|---|
| part | Yes | ||
| doc_name | Yes | ||
| plane_offset | No | ||
| feature_limit | No | ||
| cylinder_offset | 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 disclose the key behavioral traits: it is read-only in effect ("Does not move parts or change the camera"), faces are paginated at 1..500 per type, and face names are temporary references rather than stable IDs. It omits any mention of permissions, error conditions, or what the response actually contains.
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?
Five short sentences, front-loaded with the purpose before the sequencing advice and the pagination caveat. Little waste, though the define_interface aside sits slightly awkwardly between the read-only disclaimer and the pagination detail.
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 five-parameter tool with no annotations and no output schema, the description covers behavior and paging but not the return shape or the two required identity parameters (doc_name, part). An agent can call it, but must guess at the response structure and at how part is identified.
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 five parameters, so the description must compensate, and it explains pagination and the offset semantics. However, it names the offsets as next_plane_offset/next_cylinder_offset while the schema calls them plane_offset/cylinder_offset, and it says nothing about doc_name, part, or the exact meaning of feature_limit, leaving two required parameters completely unexplained.
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 first sentence names a specific verb (inspect) and the concrete resources returned (valid world-space geometry, planar faces, cylindrical hole candidates), which is far more than a restated name. It does not explicitly differentiate itself from the sibling inspect_region, so the boundary between the two inspection tools is left to inference.
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?
"Start here before assembly work" gives a clear sequencing rule, and naming define_interface as the follow-up for persistent face binding is genuinely useful routing. It also points at feature_counts for full totals, implying the paginated path is for enumeration only, but it never states when inspect_region would be preferred instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_regionA
See 1..6 focused views of selected parts, with world-geometry fingerprints.
Default Isometric/Top/Right. Produces native MCP PNG images, temporarily hides other
objects and restores camera/visibility. Requested document must be active in 3D.
size is square pixels (256..1536). Visual evidence supplements check_assembly.
| Name | Required | Description | Default |
|---|---|---|---|
| size | No | ||
| parts | Yes | ||
| views | No | ||
| doc_name | Yes |
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 disclose key side effects: it temporarily hides other objects and restores camera/visibility, and it caps output at 1..6 views and 256..1536 px. It omits failure modes, latency, and whether the restore happens on error, which keeps it below top marks.
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?
Short, front-loaded with the core capability, and each sentence adds information (defaults, side effects, precondition, size constraint). The telegraphic phrasing ('1..6', 'size is square pixels') is dense but not padded.
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 4-parameter tool with no annotations and no output schema, the description covers what the tool produces (PNG images), how it scopes them (selected parts, chosen views), and the state it disturbs and restores. Only error/permission behavior is left 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%, so the description must compensate, and it does: parts (which objects are isolated), views (default Isometric/Top/Right, 1..6 count), size (square pixels 256..1536), and doc_name (must be active in 3D) are all explained. It stops short of enumerating valid view names beyond the three defaults.
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 action (render 1..6 focused views of selected parts) and a concrete output (native MCP PNG images with world-geometry fingerprints). It differentiates itself from check_assembly as a visual supplement, but does not distinguish itself from siblings like inspect_part, get_view, or preview_alignment.
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?
Provides a precondition ('Requested document must be active in 3D') and a use-case link ('supplements check_assembly'), which gives implied guidance. It never says when to prefer this over inspect_part or get_view, or when not to use it, so the agent must infer alternative selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_documentsB
Get the list of open documents in FreeCAD.
With include_status=true, also return labels, file paths, GUI modified flags,
needs_save and needs_recompute. Default preserves the list of names.
Returns:
A list of document names, or a structured status snapshot.
| Name | Required | Description | Default |
|---|---|---|---|
| include_status | 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. It discloses the default result (document names) and the expanded status fields when include_status is true, but does not explicitly state that the operation is read-only, whether it can fail, or what permissions are required.
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 front-loaded with the core purpose and is generally efficient. The 'Returns' section and default clarification are useful, though slightly more compact phrasing could reduce minor redundancy.
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 simple list tool with one optional parameter and no output schema, the description covers the essential behavior and return shapes. It lacks error or permission context, but that is a minor gap for a read-oriented listing operation.
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 the single boolean parameter. It does so effectively by explaining that include_status=true returns labels, file paths, modified flags, needs_save, and needs_recompute, and that the default returns names only.
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 gives a specific verb and resource: 'Get the list of open documents in FreeCAD.' This clearly identifies the tool's scope, though it does not explicitly name or distinguish itself from siblings such as get_document_status or get_objects.
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 explains how the include_status parameter changes the result, but gives no guidance on when to use this tool versus alternatives like get_document_status or get_objects. There are no when-to-use or when-not-to-use statements.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plan_alignmentA
Plan rigid placement matching ordered holes and opposing mounting faces. No mutation.
Positive gap follows the fixed face outward normal. Checks all hole matches, refuses
stale geometry and degenerate patterns. Collision scope during apply is the fixed
part plus explicitly named obstacles; include nearby parts. No correspondence guessing.
Review this plan, then apply_alignment. Handles expire after FreeCAD restart/code update.
| Name | Required | Description | Default |
|---|---|---|---|
| gap_mm | No | ||
| obstacles | No | ||
| tolerance_mm | No | ||
| fixed_interface | Yes | ||
| moving_interface | Yes | ||
| angular_tolerance_deg | No | ||
| collision_tolerance_mm3 | 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 does substantial work: it discloses non-mutation, the sign convention for gap ('positive gap follows the fixed face outward normal'), validation behavior (all hole matches checked, stale geometry and degenerate patterns refused), collision scope during apply, and handle lifetime ('expire after FreeCAD restart/code update'). It still omits what the returned handle looks like and what a refusal surfaces.
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?
Purpose and the mutation disclaimer are front-loaded, and the remaining telegraphic lines each carry a distinct operational fact. The clipped phrasing ('Handles expire after...') is dense but not padded.
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 7-parameter, 0%-schema-coverage tool with no annotations and no output schema, the description covers the workflow and validation rules but leaves the three tolerance parameters and the return/handle semantics undefined. Adequate to start a call, not enough to call it confidently with non-default tolerances.
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% across 7 parameters, so the description must compensate and only partly does: it explains gap sign convention and obstacles (named parts plus nearby parts). tolerance_mm, angular_tolerance_deg, collision_tolerance_mm3, and the two interface strings are left entirely unexplained beyond a vague hint about matching holes and mounting faces.
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 and resource: plans a rigid placement by matching ordered holes and opposing mounting faces, and declares 'No mutation' to separate it from apply_alignment. Clear enough to identify the operation, though it never distinguishes itself from the closely named sibling preview_alignment.
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?
'Review this plan, then apply_alignment' gives an explicit two-step workflow and tells the agent this is the planning half of a plan/apply pair. It also advises including nearby parts in the collision scope. It does not say when to prefer this over preview_alignment or what to do when the plan is refused.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preview_alignmentA
See the proposed placement without changing the document: cyan ghost + green/orange axes.
Produces native PNGs and removes all temporary scene-graph overlays afterwards.
The plan must be fresh and unapplied. Does not add document objects or move parts.
| Name | Required | Description | Default |
|---|---|---|---|
| size | No | ||
| plan_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the load and does well: it declares read-only semantics ('without changing the document'), an output artifact ('native PNGs'), and a cleanup side effect ('removes all temporary scene-graph overlays afterwards'). It stops short of saying how the PNGs are delivered (paths vs. inline) or what happens on failure mid-cleanup.
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 with the core promise and no wasted sentences; the no-mutation guarantee is repeated as a closing clause for emphasis. The 'cyan ghost + green/orange axes' fragment is jargon-dense but conveys the visual output efficiently.
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 tool with no annotations, an undocumented 'size' parameter, and no output schema, the description is adequate but not whole. It covers behavior and side effects well yet leaves the agent guessing about image dimensions/resolution semantics and how the produced PNGs come back.
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. It hints at plan_id constraints ('fresh and unapplied') but never explains the identifier's origin or format, and the 'size' parameter is never mentioned at all, leaving one of two parameters completely opaque.
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 ('See the proposed placement') and immediately bounds the scope ('without changing the document', 'Does not add document objects or move parts'). It implicitly separates itself from a committing sibling, though it never names apply_alignment, so differentiation relies on inference.
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 a real precondition: 'The plan must be fresh and unapplied', which tells the agent when this call is valid and implies it precedes an apply step. It does not explicitly name apply_alignment as the alternative or say what to do if the plan has already been applied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reload_documentA
Close and re-open a document to pick up external file changes.
Use this AFTER the document's .FCStd file has been modified by
something outside of FreeCAD's GUI process — for example, a
headless `freecadcmd` script that edited and saved the file. The
open GUI document is otherwise unaware of on-disk changes; this
tool closes the stale in-memory copy and reopens the file from
disk so the GUI shows current geometry.
Args:
doc_name: The name of the open document to reload. Must match
the name shown by ``list_documents``.
Returns:
A message confirming the document was reloaded, or describing
the failure (document not loaded, no associated file, etc).
FreeCAD names the reopened document after the file stem, which
can differ from ``doc_name`` ("HandleConcept3D" saved as
handle-concept-3d.FCStd reopens as handle_concept_3d); the reply
names the document you should use from then on.
Examples:
```json
{
"doc_name": "chassis"
}
```
| Name | Required | Description | Default |
|---|---|---|---|
| doc_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden well: it discloses that the in-memory copy is closed and replaced ('closes the stale in-memory copy'), and warns about a non-obvious identity side effect — the reopened document is renamed after the file stem and the reply names the new identifier. It does not explicitly say whether unsaved in-memory edits are discarded or whether the operation can be undone, which is the one material behavioral gap for a destructive-ish reload.
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 with purpose then precondition, followed by Args/Returns/Examples — a clean structure. The Returns paragraph and the naming parenthetical are somewhat long, though both convey genuinely non-obvious information rather than 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?
No output schema exists, and the description supplies the return semantics itself: a confirmation message or a described failure mode (document not loaded, no associated file), plus the renamed-document caveat. For a single-parameter tool with no annotations, everything an agent needs to call it and interpret the result is 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 does: doc_name 'Must match the name shown by list_documents', tying the argument to a concrete source of truth. It further explains that the name may change after reload ('HandleConcept3D' → 'handle_concept_3d'), which is semantic information no schema field could convey.
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?
Specific verb+resource ('Close and re-open a document') with the immediate purpose (pick up external file changes) stated up front. It is clearly distinguished from sibling reads like list_documents and get_document_status, which merely report state rather than resynchronize it.
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 conditions use: 'Use this AFTER the document's .FCStd file has been modified by something outside of FreeCAD's GUI process — for example, a headless freecadcmd script.' It also explains the counterfactual (the GUI is unaware of on-disk changes), which implicitly excludes use for in-GUI edits. It routes the agent to list_documents for obtaining doc_name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_fem_analysisA
Run the CalculiX solver on an existing Fem::FemAnalysis container and return summary results.
Prerequisites in the document:
- A Part-derived solid (e.g. Part::Box, PartDesign::Body) acting as the geometry.
- A Fem::AnalysisPython container created via `create_object`.
- A Fem::MaterialCommon assigned to the geometry, added to the analysis.
- A Fem::FemMeshGmsh referencing the geometry, added to the analysis (the
mesh is generated automatically when created via `create_object`).
- At least one Fem::ConstraintFixed and one Fem::ConstraintForce (or
ConstraintPressure) bound to faces of the geometry, added to the analysis.
A SolverCcxTools is auto-created if the analysis has none.
The solver runs synchronously on the FreeCAD GUI thread and blocks all
other RPC calls for its duration; do not fan out parallel requests.
Returns max von Mises stress (MPa), max/min displacement (mm), node count,
and the working directory CalculiX wrote to. On failure, returns the
prerequisite-check or solver error along with the working directory for
triage.
Args:
doc_name: Name of the FreeCAD document.
analysis_name: Name of the Fem::AnalysisPython object.
timeout: Seconds to wait for the solver (default 600).
include_screenshot: Whether to return a screenshot of the model (default True).
Set to False to save tokens when only the numeric results are needed.
view_name: The view orientation of the returned screenshot (default "Isometric").
| Name | Required | Description | Default |
|---|---|---|---|
| timeout | No | ||
| doc_name | Yes | ||
| view_name | No | Isometric | |
| analysis_name | Yes | ||
| include_screenshot | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full responsibility and handles it well. It discloses that a SolverCcxTools is auto-created if absent, that execution blocks the GUI thread synchronously, what happens on failure, and what return values are produced. This is substantial behavioral transparency beyond the input schema.
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 well-structured with clear labeled sections: prerequisites, behavior note, return values, and arguments. It is long because the tool is complex, but every sentence provides necessary operational detail without redundancy.
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 the tool has 5 parameters, no annotations, and no output schema, the description is remarkably complete. It covers prerequisites, side effects, synchronous blocking, failure behavior, output data, and parameter semantics, giving the agent all needed context to invoke the tool correctly.
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?
The schema has 0% description coverage, but the Args section fully compensates by explaining every parameter beyond raw schema definitions. It adds practical guidance such as 'Set to False to save tokens when only the numeric results are needed' for include_screenshot and clarifies the meaning of timeout and view_name.
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 opens with a specific verb and resource: 'Run the CalculiX solver on an existing Fem::FemAnalysis container and return summary results.' This clearly distinguishes it from sibling tools like create_object, get_object, and edit_object, which manage objects rather than execute an analysis.
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 prerequisites section thoroughly explains the conditions required before using the tool, and the blocking-behavior warning explicitly tells the agent when not to use it in parallel: 'do not fan out parallel requests.' It does not explicitly name alternative tools, but no sibling tool provides equivalent functionality, so the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_assembly_operationA
Submit a native CAD job immediately; keep request_id to retry the SAME request safely.
Allowed operations are reported by get_assembly_capabilities. No arbitrary Python.
Returns job_id; poll get_assembly_job. Reusing request_id with different args fails.
Idempotency lasts while the job is retained in addon history; jobs survive MCP restart,
but not FreeCAD exit. Use this for long operations instead of waiting on a tool call.
| Name | Required | Description | Default |
|---|---|---|---|
| arguments | Yes | ||
| operation | Yes | ||
| request_id | Yes |
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 well: it discloses idempotency semantics (same request_id + different args fails), retention window tied to addon history, and lifecycle (survives MCP restart but not FreeCAD exit). It does not mention permissions, rate limits, or what happens to a partially completed job on FreeCAD exit, which keeps it from a 5.
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 retry/idempotency guidance and the return-and-poll instruction are front-loaded, and every sentence carries information. The fragmentary, telegraphic style ('No arbitrary Python.', 'Returns job_id; poll get_assembly_job.') is dense but readable.
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 an async submit tool with no output schema, the description covers the return value (job_id), the polling path, and job lifetime, which is what an agent needs to drive the workflow. The remaining hole is the shape of the 'arguments' payload, which neither schema nor description supplies.
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. It thoroughly explains request_id (idempotency key semantics, mismatch failure) and points to where valid operation values come from, but the required 'arguments' object is left entirely unexplained despite being a free-form nested object whose shape presumably depends on the operation.
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?
Opens with a specific verb+resource: 'Submit a native CAD job immediately'. It also distinguishes itself from the code-execution siblings by stating 'No arbitrary Python', and from synchronous tools by saying to use it for long operations. Slightly indirect in that the primary action is described via its async behavior rather than naming the assembly operation explicitly.
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 clear conditions: use for long operations instead of blocking on a tool call, and consult get_assembly_capabilities for the allowed operation set. It sets a real exclusion ('No arbitrary Python'), though it never states when a synchronous sibling would be preferable or what happens if the operation name is invalid.
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.
31 tool updates
v0.1.0- First observed
apply_alignment - First observed
cancel_assembly_job - First observed
check_assembly - First observed
create_assembly - First observed
create_document - First observed
create_fixed_joint - First observed
create_object - First observed
define_interface - First observed
delete_object - First observed
edit_object - First observed
execute_code - First observed
execute_code_async - First observed
execute_code_headless - First observed
get_assembly_capabilities - First observed
get_assembly_job - First observed
get_async_status - First observed
get_document_status - First observed
get_object - First observed
get_objects - First observed
get_parts_list - First observed
get_rpc_status - First observed
get_view - First observed
insert_part_from_library - First observed
inspect_part - First observed
inspect_region - First observed
list_documents - First observed
plan_alignment - First observed
preview_alignment - First observed
reload_document - First observed
run_fem_analysis - First observed
start_assembly_operation
TDQS
Scored across 31 tools
Most tools target distinct FreeCAD resources or workflow stages, but several clusters overlap: execute_code/execute_code_async/execute_code_headless, get_async_status/get_assembly_job, and the numerous assembly inspection/planning/checking tools. Detailed descriptions help, but an agent can still misselect among the code-execution and job-polling variants.
Names are overwhelmingly snake_case with a predictable verb_noun pattern: get_*, create_*, list_*, inspect_*, plan_*, apply_*, start_*, cancel_*. Minor deviations like get_parts_list, get_async_status, and execute_code_headless keep it from being perfectly consistent.
With 31 tools, the surface is heavy for an MCP server and exceeds the typical well-scoped range. Multiple specialized tools are useful for FreeCAD, but several could be consolidated, especially the three execute_code variants and separate job-status pollers.
The surface covers document lifecycle, object CRUD, viewing, parts library, FEM, assembly/alignment, and async job management, with execute_code serving as a broad fallback for missing operations. Minor gaps remain, such as explicit save/export/close document tools, but agents can work around them via code execution.
Maintenance
Related MCP Connectors
- OwlCADOAuthcom.owlcad
Parametric 3D CAD for AI agents: build print-ready parts, check them, export STL, 3MF or STEP.
CAD in ChatGPT and Claude: editable parts, STEP/STL/drawings, in-chat 3D, automatic checks.
Turn agent intent into physical parts: engineering review, measured geometry, calibrated pricing.
DXF and PDF/X-4 for AI agents: structured facts, PNG renders, an interactive in-chat viewer.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to design, modify, and verify exact B-rep 3D CAD models by running build123d scripts on an OpenCascade kernel, with live three.js preview, collision and FDM printability checks, text-based spatial perception, user notes/sketch annotations, version history, and one-click export to OrcaSlicer.1MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to build and edit native CAD parts and assemblies, inspect saved geometry and measurements, retain revisions, run mechanism and interference checks, and export STEP/STL/GLB artifacts through MCP tools.MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents on Windows to build parts from JSON recipes, create and verify whole assemblies in a single call, check mass, center of mass, mates and interference, produce drawings with BOM, balloons and sections, work with sheet metal, and import/export STEP, IGES, PDF and DXF files. All edits run with automatic backups and verified rollback so user files are never left broken.12 npmMIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to drive desktop CAD software through natural language with verified execution, failure recovery, and traceable results across modeling, assemblies, drawings, exports, motion, FEA, and related engineering workflows.MIT