Skip to main content
Glama

d365fo_file

Destructive

Create, modify, delete, undo, or generate D365FO AOT objects, including XML handling, project registration, and extension support.

Instructions

Create, modify, delete, undo, or generate a D365FO AOT object. Choose an action: • create → write a NEW object file into PackagesLocalDirectory (UTF-8 BOM, auto-added to .rnrproj). THE WRITE STEP — incomplete until isError=false; ⚠️/❌ = failure. Extensions: objectName="Base.PrefixExtension". • modify → edit an EXISTING object. APPLIES IMMEDIATELY, no dry-run — confirm with the user first; revert with action="undo". Needs operation. • delete → remove an object's XML from disk AND un-register it from every .rnrproj of the model that lists it. IRREVERSIBLE — confirm with the user first. • undo → roll back filePath: git-tracked → git checkout HEAD, which discards ALL uncommitted changes to that file, not just the last edit; untracked → deleted. • generate → XML as TEXT only, no write (Azure/Linux fallback). Try create first. create/modify/delete/undo need Windows. 📖 Parameters are NOT inlined here: get_knowledge(kind="op-spec", topic=""|"") returns the contract for the one you picked — pass its values nested in params (modify) / properties (create), along with any packageName/packagePath/solutionPath/workspacePath override. Model + prefix auto-applied.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
actionYes
paramsNo[modify] Operation-specific parameters as ONE nested object, per the op-spec lookup above. A missing/wrong one returns that COMPLETE spec — follow it, do not guess.
filePathNo[modify|delete] Absolute XML path — bypasses symbol-DB lookup. Use for objects just created. [undo] REQUIRED: the file to roll back.
modelNameNoTarget model — auto-detected. NEVER take it from search results (those are source models).
operationNo[modify] REQUIRED unless using operations[]. add-method also UPDATES in place; replace-code is the surgical oldCode→newCode path.
overwriteNoAllow overwriting — never rewrite via PowerShell.
objectNameNoBase name WITHOUT model prefix — the tool prepends it. Extension classes: "{Base}_Extension". NEVER hand-build the prefix.
objectTypeNoEach security/menu-item type is its own AOT folder — NEVER use security-privilege for duty or role. [modify]/[generate] cover the core families + their *-extension variants; [delete] takes the same enum as [create].
operationsNo[modify|create] PREFERRED for 2+ edits to the SAME object — ONE call, not one per edit. On create they run against the just-created object, under the name it actually got. Entries are {operation, …op-spec params}; objectType/objectName/modelName stay top-level. Applied in order, stopped at the first failure, per-operation results back.
propertiesNo[create] Per-objectType creation properties (label, fields[], extends, enumValues[], primaryTable, …) — not in this schema; fetch yours with the op-spec lookup above.
sourceCodeNoX++ source. FOR CLASSES auto-split: <Declaration> = class line + member vars; <Methods> = each method after the closing }.
xmlContentNoComplete XML written verbatim (+overwrite=true rewrites an object).
projectPathNoPath to .rnrproj. Set if known, else auto-detected.
addToProjectNoAdd to the ACTIVE .rnrproj — keep the default.
createBackupNo[modify] Back up before modifying.
groundingTokenNoFrom prepare(change/create). Required for *-extension when GROUNDING_ENFORCE=true; object-bound.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changedv1.17.3
    • changedInput schema / properties / operation / enum
      Previous value: -[
      -  "add-method",
      -  "remove-method",
      -  "replace-code",
      -  "add-field",
      -  "modify-field",
      -  "rename-field",
      -  "replace-all-fields",
      -  "remove-field",
      -  "add-display-method",
      -  "add-table-method",
      -  "add-index",
      -  "remove-index",
      -  "add-full-text-index",
      -  "remove-full-text-index",
      -  "add-table-mapping",
      -  "remove-table-mapping",
      -  "add-relation",
      -  "remove-relation",
      -  "add-delete-action",
      -  "remove-delete-action",
      -  "add-field-group",
      -  "remove-field-group",
      -  "add-field-to-field-group",
      -  "add-field-modification",
      -  "add-data-source",
      -  "add-control",
      -  "remove-control",
      -  "add-entry-point",
      -  "remove-entry-point",
      -  "remove-diagnostic-suppression",
      -  "add-diagnostic-suppression",
      -  "add-enum-value",
      -  "modify-enum-value",
      -  "remove-enum-value",
      -  "add-menu-item-to-menu",
      -  "modify-property",
      -  "add-query-range",
      -  "remove-query-range"
      -]New value: +[
      +  "add-method",
      +  "remove-method",
      +  "replace-code",
      +  "add-field",
      +  "modify-field",
      +  "rename-field",
      +  "replace-all-fields",
      +  "remove-field",
      +  "add-display-method",
      +  "add-table-method",
      +  "add-index",
      +  "remove-index",
      +  "add-full-text-index",
      +  "remove-full-text-index",
      +  "add-table-mapping",
      +  "remove-table-mapping",
      +  "add-relation",
      +  "remove-relation",
      +  "add-delete-action",
      +  "remove-delete-action",
      +  "add-field-group",
      +  "remove-field-group",
      +  "add-field-to-field-group",
      +  "add-field-modification",
      +  "add-data-source",
      +  "add-control",
      +  "remove-control",
      +  "add-entry-point",
      +  "remove-entry-point",
      +  "remove-diagnostic-suppression",
      +  "add-diagnostic-suppression",
      +  "add-enum-value",
      +  "modify-enum-value",
      +  "remove-enum-value",
      +  "add-menu-item-to-menu",
      +  "modify-property",
      +  "add-query-range",
      +  "remove-query-range",
      +  "report-design"
      +]
  2. Changed6 schema fields changedv1.16.2
    • removedInput schema / properties / action / description
      Removed value: -"One of the four modes described above."
    • changedInput schema / properties / action / enum
      Previous value: -[
      -  "create",
      -  "modify",
      -  "delete",
      -  "generate"
      -]New value: +[
      +  "create",
      +  "modify",
      +  "delete",
      +  "undo",
      +  "generate"
      +]
    • changedInput schema / properties / filePath / description
      Previous value: -"[modify|delete] Absolute XML path — bypasses symbol-DB lookup. Use for objects just created."New value: +"[modify|delete] Absolute XML path — bypasses symbol-DB lookup. Use for objects just created. [undo] REQUIRED: the file to roll back."
    • changedInput schema / properties / params / description
      Previous value: -"[modify] Operation-specific parameters as ONE nested object, per get_knowledge(kind=\"op-spec\", topic=\"<operation>\"). A missing/wrong one returns that COMPLETE spec — follow it, do not guess."New value: +"[modify] Operation-specific parameters as ONE nested object, per the op-spec lookup above. A missing/wrong one returns that COMPLETE spec — follow it, do not guess."
    • changedInput schema / properties / projectPath / description
      Previous value: -"Path to .rnrproj (auto-detected)."New value: +"Path to .rnrproj. Set if known, else auto-detected."
    • changedInput schema / properties / properties / description
      Previous value: -"[create] Per-objectType creation properties (label, fields[], extends, enumValues[], primaryTable, …) — NOT in this schema. Fetch yours: get_knowledge(kind=\"op-spec\", topic=\"<objectType>\")."New value: +"[create] Per-objectType creation properties (label, fields[], extends, enumValues[], primaryTable, …) — not in this schema; fetch yours with the op-spec lookup above."
  3. Changed3 schema fields changedv1.14.0
    • changedInput schema / properties / operation / description
      Previous value: -"[modify] REQUIRED unless using operations[]. add-method also UPDATES in place; replace-code is the surgical oldCode→newCode path. Parameters: get_knowledge(kind=\"op-spec\", topic=\"<operation>\")."New value: +"[modify] REQUIRED unless using operations[]. add-method also UPDATES in place; replace-code is the surgical oldCode→newCode path."
    • changedInput schema / properties / operation / enum
      Previous value: -[
      -  "add-method",
      -  "remove-method",
      -  "replace-code",
      -  "add-field",
      -  "modify-field",
      -  "rename-field",
      -  "replace-all-fields",
      -  "remove-field",
      -  "add-display-method",
      -  "add-table-method",
      -  "add-index",
      -  "remove-index",
      -  "add-full-text-index",
      -  "remove-full-text-index",
      -  "add-table-mapping",
      -  "remove-table-mapping",
      -  "add-relation",
      -  "remove-relation",
      -  "add-delete-action",
      -  "remove-delete-action",
      -  "add-field-group",
      -  "remove-field-group",
      -  "add-field-to-field-group",
      -  "add-field-modification",
      -  "add-data-source",
      -  "add-control",
      -  "remove-control",
      -  "remove-entry-point",
      -  "remove-diagnostic-suppression",
      -  "add-diagnostic-suppression",
      -  "add-enum-value",
      -  "modify-enum-value",
      -  "remove-enum-value",
      -  "add-menu-item-to-menu",
      -  "modify-property",
      -  "add-query-range",
      -  "remove-query-range"
      -]New value: +[
      +  "add-method",
      +  "remove-method",
      +  "replace-code",
      +  "add-field",
      +  "modify-field",
      +  "rename-field",
      +  "replace-all-fields",
      +  "remove-field",
      +  "add-display-method",
      +  "add-table-method",
      +  "add-index",
      +  "remove-index",
      +  "add-full-text-index",
      +  "remove-full-text-index",
      +  "add-table-mapping",
      +  "remove-table-mapping",
      +  "add-relation",
      +  "remove-relation",
      +  "add-delete-action",
      +  "remove-delete-action",
      +  "add-field-group",
      +  "remove-field-group",
      +  "add-field-to-field-group",
      +  "add-field-modification",
      +  "add-data-source",
      +  "add-control",
      +  "remove-control",
      +  "add-entry-point",
      +  "remove-entry-point",
      +  "remove-diagnostic-suppression",
      +  "add-diagnostic-suppression",
      +  "add-enum-value",
      +  "modify-enum-value",
      +  "remove-enum-value",
      +  "add-menu-item-to-menu",
      +  "modify-property",
      +  "add-query-range",
      +  "remove-query-range"
      +]
    • changedInput schema / properties / operations / description
      Previous value: -"[modify] PREFERRED for 2+ edits to the SAME object — ONE call, not one per edit. Entries are {operation, …op-spec params}; objectType/objectName/modelName stay top-level. Applied in order, stopped at the first failure, per-operation results back. 3 fields + their field groups + an index: 7 calls flat, 1 here."New value: +"[modify|create] PREFERRED for 2+ edits to the SAME object — ONE call, not one per edit. On create they run against the just-created object, under the name it actually got. Entries are {operation, …op-spec params}; objectType/objectName/modelName stay top-level. Applied in order, stopped at the first failure, per-operation results back."
  4. Changed1 schema field changedv1.13.0
    • changedInput schema / properties / operation / enum
      Previous value: -[
      -  "add-method",
      -  "remove-method",
      -  "replace-code",
      -  "add-field",
      -  "modify-field",
      -  "rename-field",
      -  "replace-all-fields",
      -  "remove-field",
      -  "add-display-method",
      -  "add-table-method",
      -  "add-index",
      -  "remove-index",
      -  "add-full-text-index",
      -  "remove-full-text-index",
      -  "add-table-mapping",
      -  "remove-table-mapping",
      -  "add-relation",
      -  "remove-relation",
      -  "add-delete-action",
      -  "remove-delete-action",
      -  "add-field-group",
      -  "remove-field-group",
      -  "add-field-to-field-group",
      -  "add-field-modification",
      -  "add-data-source",
      -  "add-control",
      -  "remove-control",
      -  "remove-entry-point",
      -  "remove-diagnostic-suppression",
      -  "add-diagnostic-suppression",
      -  "add-enum-value",
      -  "modify-enum-value",
      -  "remove-enum-value",
      -  "add-menu-item-to-menu",
      -  "modify-property"
      -]New value: +[
      +  "add-method",
      +  "remove-method",
      +  "replace-code",
      +  "add-field",
      +  "modify-field",
      +  "rename-field",
      +  "replace-all-fields",
      +  "remove-field",
      +  "add-display-method",
      +  "add-table-method",
      +  "add-index",
      +  "remove-index",
      +  "add-full-text-index",
      +  "remove-full-text-index",
      +  "add-table-mapping",
      +  "remove-table-mapping",
      +  "add-relation",
      +  "remove-relation",
      +  "add-delete-action",
      +  "remove-delete-action",
      +  "add-field-group",
      +  "remove-field-group",
      +  "add-field-to-field-group",
      +  "add-field-modification",
      +  "add-data-source",
      +  "add-control",
      +  "remove-control",
      +  "remove-entry-point",
      +  "remove-diagnostic-suppression",
      +  "add-diagnostic-suppression",
      +  "add-enum-value",
      +  "modify-enum-value",
      +  "remove-enum-value",
      +  "add-menu-item-to-menu",
      +  "modify-property",
      +  "add-query-range",
      +  "remove-query-range"
      +]
  5. Changed6 schema fields changedv1.12.0
    • changedInput schema / properties / action / description
      Previous value: -"One of the three modes described above."New value: +"One of the four modes described above."
    • changedInput schema / properties / action / enum
      Previous value: -[
      -  "create",
      -  "modify",
      -  "generate"
      -]New value: +[
      +  "create",
      +  "modify",
      +  "delete",
      +  "generate"
      +]
    • changedInput schema / properties / filePath / description
      Previous value: -"[modify] Absolute XML path — bypasses symbol-DB lookup. Use for objects just created."New value: +"[modify|delete] Absolute XML path — bypasses symbol-DB lookup. Use for objects just created."
    • changedInput schema / properties / objectType / description
      Previous value: -"Each security/menu-item type is its own AOT folder — NEVER use security-privilege for duty or role. [modify]/[generate] cover the core families + their *-extension variants."New value: +"Each security/menu-item type is its own AOT folder — NEVER use security-privilege for duty or role. [modify]/[generate] cover the core families + their *-extension variants; [delete] takes the same enum as [create]."
    • changedInput schema / properties / objectType / enum
      Previous value: -[
      -  "class",
      -  "table",
      -  "enum",
      -  "form",
      -  "query",
      -  "view",
      -  "data-entity",
      -  "report",
      -  "edt",
      -  "table-extension",
      -  "class-extension",
      -  "form-extension",
      -  "enum-extension",
      -  "edt-extension",
      -  "data-entity-extension",
      -  "menu-item-display-extension",
      -  "menu-item-action-extension",
      -  "menu-item-output-extension",
      -  "menu-extension",
      -  "menu-item-display",
      -  "menu-item-action",
      -  "menu-item-output",
      -  "menu",
      -  "security-privilege",
      -  "security-duty",
      -  "security-role",
      -  "security-duty-extension",
      -  "security-role-extension",
      -  "business-event",
      -  "tile",
      -  "kpi",
      -  "map",
      -  "service",
      -  "service-group",
      -  "macro",
      -  "configuration-key",
      -  "security-policy",
      -  "aggregate-measurement",
      -  "license-code"
      -]New value: +[
      +  "class",
      +  "table",
      +  "enum",
      +  "form",
      +  "query",
      +  "view",
      +  "data-entity",
      +  "report",
      +  "edt",
      +  "table-extension",
      +  "class-extension",
      +  "form-extension",
      +  "enum-extension",
      +  "edt-extension",
      +  "data-entity-extension",
      +  "menu-item-display-extension",
      +  "menu-item-action-extension",
      +  "menu-item-output-extension",
      +  "menu-extension",
      +  "menu-item-display",
      +  "menu-item-action",
      +  "menu-item-output",
      +  "menu",
      +  "security-privilege",
      +  "security-duty",
      +  "security-role",
      +  "security-duty-extension",
      +  "security-role-extension",
      +  "ignore-diagnostic-list",
      +  "business-event",
      +  "tile",
      +  "kpi",
      +  "map",
      +  "service",
      +  "service-group",
      +  "macro",
      +  "configuration-key",
      +  "security-policy",
      +  "aggregate-measurement",
      +  "license-code"
      +]
    • changedInput schema / properties / operation / enum
      Previous value: -[
      -  "add-method",
      -  "remove-method",
      -  "replace-code",
      -  "add-field",
      -  "modify-field",
      -  "rename-field",
      -  "replace-all-fields",
      -  "remove-field",
      -  "add-display-method",
      -  "add-table-method",
      -  "add-index",
      -  "remove-index",
      -  "add-full-text-index",
      -  "remove-full-text-index",
      -  "add-table-mapping",
      -  "remove-table-mapping",
      -  "add-relation",
      -  "remove-relation",
      -  "add-delete-action",
      -  "remove-delete-action",
      -  "add-field-group",
      -  "remove-field-group",
      -  "add-field-to-field-group",
      -  "add-field-modification",
      -  "add-data-source",
      -  "add-control",
      -  "add-enum-value",
      -  "modify-enum-value",
      -  "remove-enum-value",
      -  "add-menu-item-to-menu",
      -  "modify-property"
      -]New value: +[
      +  "add-method",
      +  "remove-method",
      +  "replace-code",
      +  "add-field",
      +  "modify-field",
      +  "rename-field",
      +  "replace-all-fields",
      +  "remove-field",
      +  "add-display-method",
      +  "add-table-method",
      +  "add-index",
      +  "remove-index",
      +  "add-full-text-index",
      +  "remove-full-text-index",
      +  "add-table-mapping",
      +  "remove-table-mapping",
      +  "add-relation",
      +  "remove-relation",
      +  "add-delete-action",
      +  "remove-delete-action",
      +  "add-field-group",
      +  "remove-field-group",
      +  "add-field-to-field-group",
      +  "add-field-modification",
      +  "add-data-source",
      +  "add-control",
      +  "remove-control",
      +  "remove-entry-point",
      +  "remove-diagnostic-suppression",
      +  "add-diagnostic-suppression",
      +  "add-enum-value",
      +  "modify-enum-value",
      +  "remove-enum-value",
      +  "add-menu-item-to-menu",
      +  "modify-property"
      +]
  6. Changed1 schema field changedv1.10.0
    • changedInput schema / properties / addToProject / description
      Previous value: -"Add to the .rnrproj — keep the default."New value: +"Add to the ACTIVE .rnrproj — keep the default."
  7. Changed20 schema fields changedv1.9.0
    • changedInput schema / properties / addToProject / description
      Previous value: -"Add the file to the .rnrproj project. Keep the default (true) unless explicitly asked otherwise."New value: +"Add to the .rnrproj — keep the default."
    • changedInput schema / properties / createBackup / description
      Previous value: -"[modify] Create backup before modification (default false)"New value: +"[modify] Back up before modifying."
    • changedInput schema / properties / filePath / description
      Previous value: -"[modify] Absolute path to the XML file — bypasses symbol-DB lookup. Use when the object was just created."New value: +"[modify] Absolute XML path — bypasses symbol-DB lookup. Use for objects just created."
    • changedInput schema / properties / groundingToken / description
      Previous value: -"Provenance token from prepare(change/create). Required for *-extension objectTypes when GROUNDING_ENFORCE=true; object-bound — only valid for the object it was issued for."New value: +"From prepare(change/create). Required for *-extension when GROUNDING_ENFORCE=true; object-bound."
    • changedInput schema / properties / modelName / description
      Previous value: -"Target model name — auto-detected from .mcp.json if omitted. NEVER guess or take model names from search results (source models)."New value: +"Target model — auto-detected. NEVER take it from search results (those are source models)."
    • changedInput schema / properties / objectName / description
      Previous value: -"Base name WITHOUT model prefix — the tool prepends EXTENSION_PREFIX (or modelName) and detects an existing prefix. Extension classes: pass \"{Base}_Extension\" with NO prefix infix. NEVER hand-build the prefix."New value: +"Base name WITHOUT model prefix — the tool prepends it. Extension classes: \"{Base}_Extension\". NEVER hand-build the prefix."
    • changedInput schema / properties / objectType / description
      Previous value: -"Each security/menu-item type maps to its own AOT folder — NEVER use security-privilege for duty or role. class-extension = [ExtensionOf] final class skeleton; business-event = BusinessEventsBase + Contract pair. [modify] supports class/table/form/enum/query/view/edt/data-entity/report + *-extension variants. [generate] supports class/table/enum/form/query/view/data-entity/report + table/form/enum/edt/data-entity-extension."New value: +"Each security/menu-item type is its own AOT folder — NEVER use security-privilege for duty or role. [modify]/[generate] cover the core families + their *-extension variants."
    • changedInput schema / properties / operation / description
      Previous value: -"[modify] REQUIRED. Modification to perform. Non-obvious ones:\nadd-method: adds OR updates in place if the name exists (position kept).\nreplace-code: surgical oldCode→newCode; preferred for rewriting a known method. Control overrides: methodName=\"Control.method\".\nrename-field: also fixes index DataField refs and TitleField1/2.\nreplace-all-fields: atomic rewrite of ALL fields.\nadd-display-method: display method with [SysClientCacheDataMethodAttribute].\nadd-table-method: canonical find/exist/findByRecId/validate*/initValue boilerplate.\nadd-field-modification: override base-table field label/mandatory in a table-extension.\nadd-delete-action: DeleteActions entry — deleteActionName + optional deleteActionTable/deleteActionType.\nadd-full-text-index/add-table-mapping: the <FullTextIndexes>/<Mappings> collections.\nmodify-property: any object-level property (TableGroup, TitleField1, Extends…) — see propertyPath; on an *-extension it becomes a PropertyModification."New value: +"[modify] REQUIRED unless using operations[]. add-method also UPDATES in place; replace-code is the surgical oldCode→newCode path. Parameters: get_knowledge(kind=\"op-spec\", topic=\"<operation>\")."
    • addedInput schema / properties / operations
      Added value: +{
      +  "description": "[modify] PREFERRED for 2+ edits to the SAME object — ONE call, not one per edit. Entries are {operation, …op-spec params}; objectType/objectName/modelName stay top-level. Applied in order, stopped at the first failure, per-operation results back. 3 fields + their field groups + an index: 7 calls flat, 1 here.",
      +  "items": {
      +    "additionalProperties": true,
      +    "type": "object"
      +  },
      +  "maxItems": 20,
      +  "type": "array"
      +}
    • changedInput schema / properties / overwrite / description
      Previous value: -"Allow overwriting an existing file (use with xmlContent to rewrite an object — never via PowerShell/create_file)."New value: +"Allow overwriting — never rewrite via PowerShell."
    • removedInput schema / properties / packageName
      Removed value: -{
      -  "description": "Package name — auto-resolved from model name; pass only if they differ.",
      -  "type": "string"
      -}
    • removedInput schema / properties / packagePath
      Removed value: -{
      -  "description": "Base package path (default: auto-detected PackagesLocalDirectory). [modify] also locates objects outside the default dir; for models outside bridge startup roots set D365FO_CUSTOM_PACKAGES_PATH or pass filePath.",
      -  "type": "string"
      -}
    • changedInput schema / properties / params / description
      Previous value: -"[modify] Operation-specific parameters as ONE object — NEST them here. Common shapes: add-method {methodName, sourceCode} · replace-code {oldCode, newCode, methodName?} · add-field {fieldName, fieldType(EDT), fieldBaseType?}; data-entity-ext {fieldName, dataField, dataSource} · rename-field {fieldName, fieldNewName} · add-index {indexName, indexFields[{fieldName}]} · add-relation {relationName, relatedTable, relationConstraints?} · add-field-group {fieldGroupName, fieldGroupFields?} · add-data-source {dataSourceName, dataSourceTable} · add-control {controlName, parentControl, controlDataSource?, controlDataField?} · enum ops {enumValueName, enumValueNewName?(modify-enum-value rename), enumValueLabel?, enumValueInt?} · add-menu-item-to-menu {menuItemToAdd} · modify-property {propertyPath, propertyValue} · add-table-method {tableMethodType, tableKeyField?} · add-display-method {methodName, displayMethodReturnEdt}. A missing/wrong parameter returns the COMPLETE spec for that operation — follow it instead of guessing."New value: +"[modify] Operation-specific parameters as ONE nested object, per get_knowledge(kind=\"op-spec\", topic=\"<operation>\"). A missing/wrong one returns that COMPLETE spec — follow it, do not guess."
    • changedInput schema / properties / projectPath / description
      Previous value: -"Path to .rnrproj file (needed for addToProject). Auto-detected from .mcp.json or workspace if omitted."New value: +"Path to .rnrproj (auto-detected)."
    • addedInput schema / properties / properties / additionalProperties
      Added value: +true
    • changedInput schema / properties / properties / description
      Previous value: -"Additional properties by objectType:\n• class: extends, implements, isFinal, isAbstract\n• table: label, tableGroup, tableType, titleField1/2, cacheLookup?, primaryIndex?, allowRowVersionChangeTracking? (dual-write), created/modifiedBy/DateTime?, fields[{name,type?|edt?|fieldType?,enumType?,label?,mandatory?}] — enum fields need enumType (+ optionally fieldType:\"AxTableFieldEnum\")\n• enum: label, useEnumValue, configurationKey, isExtensible, enumValues[{name,value?,label?,helpText?}]\n• enum-extension: enumValues[{name,label?,value?,countryRegionCodes?}]\n• table-extension: fields[{name,edt?,enumType?,label?,mandatory?,fieldType?}] — enum fields need fieldType:\"AxTableFieldEnum\" + enumType\n• edt: label, extends, edtType, stringSize\n• edt-extension: label?, helpText?, stringSize?, extends?, formHelp?, propertyModifications?[{name,value}] = the change\n• form: caption, formTemplate, dataSource\n• security-privilege: label, targetObject, objectType (MenuItemDisplay|Action|Output), accessLevel (view|maintain), dataEntity (grants perms)\n• security-duty: label, privileges[]\n• security-role: label, duties[], privileges[]\n• menu-item-*: label, object, objectType\n• data-entity: primaryTable, fields[{name,dataField?}], primaryKey?, primaryKeyFields?[], isPublic?, entityCategory?, dynamicFields?, allowRowVersionChangeTracking? (dual-write: set on the source TABLES too), dataManagementEnabled? (needs staging table)\n• map: label?, developerDocumentation?, fields[{name,type?,edt?,enumType?,stringSize?}], mappingTable?, mappings?[{mapField,mapFieldTo}] (one connection/field by default)\n• query: title?, dataSource (root table; table also works), dataSourceName?, fields?[{name,field?}]\n• view: query (existing AxQuery), fields[{name,dataField?}] — dataSource defaults to query\n• service: serviceClass (defaults to the service name), externalName?, namespace?, description?, operations[\"opName\"] or [{name?,method?,enableIdempotence?,subscriberAccessLevelRead?}]\n• service-group: autoDeploy? (Yes publishes at /api/services), description?, services[\"MyService\"] or [{name?,service?}]\n  ⚠ service/service-group CROSS-REFS (serviceClass, services[].service) are written VERBATIM — only objectName is prefixed. Pass the FINAL name (e.g. \"ContosoDemoNoteService\", not \"DemoNoteService\") or the group resolves to nothing; verbatim also lets it reference an unprefixed MS service."New value: +"[create] Per-objectType creation properties (label, fields[], extends, enumValues[], primaryTable, …) — NOT in this schema. Fetch yours: get_knowledge(kind=\"op-spec\", topic=\"<objectType>\")."
    • removedInput schema / properties / solutionPath
      Removed value: -{
      -  "description": "VS solution directory — used to find .rnrproj when projectPath unset.",
      -  "type": "string"
      -}
    • changedInput schema / properties / sourceCode / description
      Previous value: -"X++ source for the object. FOR CLASSES the content is auto-split: <Declaration> = the class line + ALL member variables inside the outer { }; <Methods> = each method AFTER the closing }."New value: +"X++ source. FOR CLASSES auto-split: <Declaration> = class line + member vars; <Methods> = each method after the closing }."
    • removedInput schema / properties / workspacePath
      Removed value: -{
      -  "description": "[modify] Workspace path for finding file",
      -  "type": "string"
      -}
    • changedInput schema / properties / xmlContent / description
      Previous value: -"Complete XML to write verbatim (with overwrite=true rewrites an existing object; Azure/Linux: pass XML from action=generate)."New value: +"Complete XML written verbatim (+overwrite=true rewrites an object)."
  8. First observedv1.8.0

TDQS

A4.7/5.0
Behavior5/5

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

Beyond destructiveHint=true, the description discloses that modify applies immediately with no dry-run, delete is irreversible, undo via git checkout discards ALL uncommitted changes to the file, and create is incomplete until isError=false. It also surfaces platform constraints and side effects like auto-adding to .rnrproj, which is rich behavioral context.

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

Conciseness5/5

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

The description is dense but well structured, with a front-loaded action list and scannable bullets. The warnings, symbols, and reminders all carry operational weight, and the schema handles the remaining parameter details without redundancy.

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

Completeness4/5

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

For a complex 16-parameter mutation tool with no output schema, the description covers side effects, irreversibility, platform limits, failure indicators, and how to retrieve operation specs. It stops just short of defining the full success/error return payload shape, though the isError/⚠️/❌ cues and per-operation results partly compensate.

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

Parameters5/5

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

Even though schema coverage is 94%, the description adds important cross-parameter semantics: nesting params vs properties, batching with operations[], filePath bypassing symbol-DB lookup, objectName never including the prefix, and modelName never taken from search results. It also directs the agent to fetch op-spec contracts rather than guess.

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

Purpose5/5

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

The opening sentence names the resource (D365FO AOT object) and the five concrete verbs: create, modify, delete, undo, generate. Each bullet distinguishes an action from the others, and generate is explicitly contrasted with create as a text-only, no-write fallback.

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

Usage Guidelines4/5

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

The description gives clear when-to-use guidance per action: new vs existing objects, Windows vs Azure/Linux fallback, write vs text-only, and user-confirmation gates for modify/delete. It does not explicitly route around sibling tools such as prepare or get_object_info, so it misses some alternative-selection guidance.

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