d365fo-mcp 1.14.0 → 1.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (235) hide show
  1. package/.github/copilot-instructions.md +4 -4
  2. package/README.md +4 -4
  3. package/bridge/D365MetadataBridge/Models/Models.cs +20 -0
  4. package/bridge/D365MetadataBridge/Services/MetadataReadService.cs +480 -13
  5. package/bridge/D365MetadataBridge/Services/MetadataWriteService.cs +37 -1
  6. package/dist/bridge/bridgeAdapter.d.ts +138 -2
  7. package/dist/bridge/bridgeAdapter.js +333 -58
  8. package/dist/bridge/bridgeClient.d.ts +2 -0
  9. package/dist/bridge/bridgeClient.js +20 -0
  10. package/dist/bridge/bridgeFailure.d.ts +3 -1
  11. package/dist/bridge/bridgeFailure.js +15 -6
  12. package/dist/bridge/bridgeTypes.d.ts +14 -0
  13. package/dist/cli/commands/bpCatalog.js +5 -2
  14. package/dist/config/settings.js +49 -5
  15. package/dist/index.js +22 -9
  16. package/dist/knowledge/compilerFacts.d.ts +50 -0
  17. package/dist/knowledge/compilerFacts.generated.d.ts +27 -0
  18. package/dist/knowledge/compilerFacts.generated.js +915 -0
  19. package/dist/knowledge/compilerFacts.js +67 -0
  20. package/dist/knowledge/kernelEnums.js +27 -0
  21. package/dist/knowledge/mobileAppPatterns/catalog.d.ts +20 -0
  22. package/dist/knowledge/mobileAppPatterns/catalog.js +548 -0
  23. package/dist/knowledge/mobileAppPatterns/index.d.ts +19 -0
  24. package/dist/knowledge/mobileAppPatterns/index.js +115 -0
  25. package/dist/knowledge/mobileAppPatterns/types.d.ts +62 -0
  26. package/dist/knowledge/mobileAppPatterns/types.js +22 -0
  27. package/dist/knowledge/reportPatterns/catalog.d.ts +16 -0
  28. package/dist/knowledge/reportPatterns/catalog.js +411 -0
  29. package/dist/knowledge/reportPatterns/index.d.ts +13 -0
  30. package/dist/knowledge/reportPatterns/index.js +73 -0
  31. package/dist/knowledge/reportPatterns/types.d.ts +43 -0
  32. package/dist/knowledge/reportPatterns/types.js +11 -0
  33. package/dist/metadata/indexWarmup.d.ts +43 -0
  34. package/dist/metadata/indexWarmup.js +62 -0
  35. package/dist/metadata/indexWarmupWorker.d.ts +67 -0
  36. package/dist/metadata/indexWarmupWorker.js +117 -0
  37. package/dist/metadata/symbolIndex.d.ts +23 -0
  38. package/dist/metadata/symbolIndex.js +72 -5
  39. package/dist/prompts/codeReview.js +5 -0
  40. package/dist/prompts/systemInstructions.js +5 -2
  41. package/dist/resources/index.d.ts +1 -0
  42. package/dist/resources/index.js +43 -14
  43. package/dist/scripts/build-database.js +66 -9
  44. package/dist/scripts/build-fts.js +66 -9
  45. package/dist/scripts/buildIndexWorker.js +149 -0
  46. package/dist/scripts/extract-metadata.js +38 -4
  47. package/dist/scripts/indexWarmupWorker.js +201 -0
  48. package/dist/server/serverMode.d.ts +23 -3
  49. package/dist/server/serverMode.js +46 -12
  50. package/dist/server/toolAnnotations.js +1 -4
  51. package/dist/server/toolSchemas/buildD365foProject.d.ts +13 -4
  52. package/dist/server/toolSchemas/buildD365foProject.js +15 -5
  53. package/dist/server/toolSchemas/d365foFile.d.ts +4 -1
  54. package/dist/server/toolSchemas/d365foFile.js +19 -12
  55. package/dist/server/toolSchemas/generateObject.d.ts +0 -1
  56. package/dist/server/toolSchemas/generateObject.js +14 -5
  57. package/dist/server/toolSchemas/getKnowledge.d.ts +0 -1
  58. package/dist/server/toolSchemas/getKnowledge.js +6 -4
  59. package/dist/server/toolSchemas/getObjectInfo.d.ts +0 -1
  60. package/dist/server/toolSchemas/getObjectInfo.js +5 -2
  61. package/dist/server/toolSchemas/getWorkspaceInfo.d.ts +11 -0
  62. package/dist/server/toolSchemas/getWorkspaceInfo.js +14 -3
  63. package/dist/server/toolSchemas/index.d.ts +180 -89
  64. package/dist/server/toolSchemas/index.js +0 -6
  65. package/dist/server/toolSchemas/labels.d.ts +0 -5
  66. package/dist/server/toolSchemas/labels.js +12 -15
  67. package/dist/server/toolSchemas/objectPatterns.js +12 -10
  68. package/dist/server/toolSchemas/prepare.d.ts +0 -1
  69. package/dist/server/toolSchemas/prepare.js +19 -6
  70. package/dist/server/toolSchemas/runBpCheck.d.ts +0 -8
  71. package/dist/server/toolSchemas/runBpCheck.js +7 -3
  72. package/dist/server/toolSchemas/runSystestClass.js +1 -1
  73. package/dist/server/toolSchemas/search.js +3 -4
  74. package/dist/server/toolSchemas/securityInfo.d.ts +0 -1
  75. package/dist/server/toolSchemas/securityInfo.js +1 -1
  76. package/dist/server/toolSchemas/updateSymbolIndex.js +5 -3
  77. package/dist/server/toolSchemas/validateCode.js +4 -4
  78. package/dist/server/toolSchemas/validateObjectNaming.js +1 -1
  79. package/dist/server/toolSchemas/verifyD365foProject.d.ts +0 -8
  80. package/dist/server/toolSchemas/verifyD365foProject.js +6 -3
  81. package/dist/server/transport.d.ts +19 -0
  82. package/dist/server/transport.js +21 -8
  83. package/dist/tools/analysis/batchSearch.js +17 -23
  84. package/dist/tools/analysis/findReferences.js +107 -7
  85. package/dist/tools/analysis/search.d.ts +24 -0
  86. package/dist/tools/analysis/search.js +165 -13
  87. package/dist/tools/analysis/searchLabels.d.ts +4 -0
  88. package/dist/tools/analysis/searchLabels.js +115 -12
  89. package/dist/tools/analysis/validateObjectNaming.js +1 -0
  90. package/dist/tools/analysis/validateXpp.d.ts +28 -6
  91. package/dist/tools/analysis/validateXpp.js +1424 -146
  92. package/dist/tools/d365foFile.d.ts +2 -1
  93. package/dist/tools/d365foFile.js +166 -8
  94. package/dist/tools/knowledge/bpMonikerHelp.js +22 -5
  95. package/dist/tools/knowledge/getKnowledge.d.ts +27 -0
  96. package/dist/tools/knowledge/getKnowledge.js +51 -4
  97. package/dist/tools/knowledge/getMobileAppPatterns.d.ts +22 -0
  98. package/dist/tools/knowledge/getMobileAppPatterns.js +29 -0
  99. package/dist/tools/knowledge/getReportPatterns.d.ts +22 -0
  100. package/dist/tools/knowledge/getReportPatterns.js +29 -0
  101. package/dist/tools/knowledge/objectPatterns.d.ts +1 -0
  102. package/dist/tools/knowledge/objectPatterns.js +42 -4
  103. package/dist/tools/knowledge/xppKnowledge.js +1402 -45
  104. package/dist/tools/labels.js +23 -1
  105. package/dist/tools/prepare/prepare.d.ts +1 -1
  106. package/dist/tools/prepare/prepare.js +23 -6
  107. package/dist/tools/prepare/prepareChange.d.ts +22 -0
  108. package/dist/tools/prepare/prepareChange.js +219 -37
  109. package/dist/tools/prepare/prepareCreate.d.ts +5 -0
  110. package/dist/tools/prepare/prepareCreate.js +233 -30
  111. package/dist/tools/prepare/prepareTest.d.ts +3 -0
  112. package/dist/tools/prepare/prepareTest.js +244 -0
  113. package/dist/tools/readers/edtInfo.js +91 -16
  114. package/dist/tools/readers/formInfo.js +138 -9
  115. package/dist/tools/readers/getObjectInfo.js +135 -3
  116. package/dist/tools/readers/getWorkspaceInfo.js +68 -25
  117. package/dist/tools/readers/tableInfo.d.ts +1 -13
  118. package/dist/tools/readers/tableInfo.js +39 -2
  119. package/dist/tools/responseCaps.d.ts +11 -0
  120. package/dist/tools/responseCaps.js +116 -0
  121. package/dist/tools/sdlc/buildProject.d.ts +26 -0
  122. package/dist/tools/sdlc/buildProject.js +115 -7
  123. package/dist/tools/sdlc/dbSync.js +5 -5
  124. package/dist/tools/sdlc/reviewWorkspaceChanges.d.ts +1 -1
  125. package/dist/tools/sdlc/reviewWorkspaceChanges.js +78 -9
  126. package/dist/tools/sdlc/runBpCheck.js +22 -2
  127. package/dist/tools/sdlc/sysTestRunner.d.ts +17 -0
  128. package/dist/tools/sdlc/sysTestRunner.js +180 -10
  129. package/dist/tools/sdlc/undoLastModification.js +4 -4
  130. package/dist/tools/sdlc/updateSymbolIndex.js +22 -1
  131. package/dist/tools/smart/codeGen.d.ts +8 -0
  132. package/dist/tools/smart/codeGen.js +593 -16
  133. package/dist/tools/smart/generateSmartForm.js +92 -17
  134. package/dist/tools/smart/generateSmartReport.d.ts +10 -2
  135. package/dist/tools/smart/generateSmartReport.js +161 -49
  136. package/dist/tools/smart/generateSmartTable.d.ts +21 -3
  137. package/dist/tools/smart/generateSmartTable.js +101 -7
  138. package/dist/tools/specs/d365foFileOpSpecs.d.ts +42 -0
  139. package/dist/tools/specs/d365foFileOpSpecs.js +115 -14
  140. package/dist/tools/specs/generateObjectOpSpecs.js +78 -4
  141. package/dist/tools/specs/getFormPatternSpec.js +1 -0
  142. package/dist/tools/specs/labelsOpSpecs.js +16 -2
  143. package/dist/tools/specs/opSpecs.d.ts +1 -15
  144. package/dist/tools/specs/opSpecs.js +95 -9
  145. package/dist/tools/toolHandler.d.ts +0 -1
  146. package/dist/tools/toolHandler.js +66 -53
  147. package/dist/tools/write/createD365File.d.ts +27 -451
  148. package/dist/tools/write/createD365File.js +403 -2660
  149. package/dist/tools/write/createLabel.d.ts +95 -0
  150. package/dist/tools/write/createLabel.js +270 -4
  151. package/dist/tools/write/deleteD365File.js +1 -1
  152. package/dist/tools/write/directXmlWriters.d.ts +401 -0
  153. package/dist/tools/write/directXmlWriters.js +1616 -0
  154. package/dist/tools/write/inlineWriteVerification.d.ts +19 -0
  155. package/dist/tools/write/inlineWriteVerification.js +37 -0
  156. package/dist/tools/write/modifyD365File.d.ts +73 -67
  157. package/dist/tools/write/modifyD365File.js +602 -1630
  158. package/dist/tools/write/objectIdentityGate.d.ts +71 -0
  159. package/dist/tools/write/objectIdentityGate.js +126 -0
  160. package/dist/tools/write/preserveMetadataElements.d.ts +81 -0
  161. package/dist/tools/write/preserveMetadataElements.js +217 -0
  162. package/dist/tools/write/renameLabel.js +4 -3
  163. package/dist/tools/write/resolveReferences.d.ts +7 -0
  164. package/dist/tools/write/resolveReferences.js +202 -49
  165. package/dist/tools/xml/createTablePropertyHonesty.d.ts +2 -0
  166. package/dist/tools/xml/createTablePropertyHonesty.js +33 -7
  167. package/dist/tools/xml/formXml.js +54 -2
  168. package/dist/tools/xml/generateD365Xml.d.ts +6 -152
  169. package/dist/tools/xml/generateD365Xml.js +6 -1214
  170. package/dist/tools/xml/generateTableFields.d.ts +1 -1
  171. package/dist/tools/xml/generateTableFields.js +4 -4
  172. package/dist/tools/xml/queryViewXml.d.ts +1 -1
  173. package/dist/tools/xml/queryViewXml.js +2 -2
  174. package/dist/tools/xml/securityDutyRoleXml.d.ts +1 -1
  175. package/dist/tools/xml/securityDutyRoleXml.js +1 -1
  176. package/dist/tools/xml/tableXml.d.ts +42 -0
  177. package/dist/tools/xml/tableXml.js +112 -24
  178. package/dist/tools/xml/xmlTemplateGenerator.d.ts +481 -0
  179. package/dist/tools/xml/xmlTemplateGenerator.js +2637 -0
  180. package/dist/utils/axEnumProperties.d.ts +31 -21
  181. package/dist/utils/axEnumProperties.js +48 -46
  182. package/dist/utils/axTablePropertyOrder.d.ts +1 -1
  183. package/dist/utils/axTablePropertyOrder.js +1 -1
  184. package/dist/utils/baseObjectXml.d.ts +22 -0
  185. package/dist/utils/baseObjectXml.js +88 -0
  186. package/dist/utils/configManager.d.ts +14 -0
  187. package/dist/utils/configManager.js +69 -5
  188. package/dist/utils/fieldControlTypes.d.ts +35 -1
  189. package/dist/utils/fieldControlTypes.js +118 -2
  190. package/dist/utils/formPatternTemplates.d.ts +51 -2
  191. package/dist/utils/formPatternTemplates.js +54 -22
  192. package/dist/utils/indexStaleness.d.ts +35 -2
  193. package/dist/utils/indexStaleness.js +58 -2
  194. package/dist/utils/labelDiskCheck.d.ts +13 -0
  195. package/dist/utils/labelDiskCheck.js +46 -13
  196. package/dist/utils/labelReference.d.ts +40 -0
  197. package/dist/utils/labelReference.js +75 -0
  198. package/dist/utils/loopLag.d.ts +38 -0
  199. package/dist/utils/loopLag.js +81 -0
  200. package/dist/utils/modelClassifier.js +19 -0
  201. package/dist/utils/objectNamingRules.d.ts +12 -0
  202. package/dist/utils/objectNamingRules.js +86 -17
  203. package/dist/utils/packageResolver.d.ts +22 -0
  204. package/dist/utils/packageResolver.js +65 -0
  205. package/dist/utils/phaseTimer.js +36 -0
  206. package/dist/utils/repeatedNotes.d.ts +29 -0
  207. package/dist/utils/repeatedNotes.js +38 -0
  208. package/dist/utils/smartXmlBuilder.js +1 -1
  209. package/dist/utils/symbolLookup.d.ts +18 -0
  210. package/dist/utils/symbolLookup.js +41 -0
  211. package/dist/utils/workspaceDetector.d.ts +5 -0
  212. package/dist/utils/workspaceDetector.js +1 -1
  213. package/dist/utils/writeSideEffects.d.ts +43 -0
  214. package/dist/utils/writeSideEffects.js +56 -0
  215. package/dist/utils/xmlScan.d.ts +50 -0
  216. package/dist/utils/xmlScan.js +88 -0
  217. package/dist/utils/xppLexer.d.ts +61 -0
  218. package/dist/utils/xppLexer.js +125 -0
  219. package/dist/utils/xppSelectLint.js +8 -36
  220. package/dist/validation/formControlElementOrder.d.ts +86 -0
  221. package/dist/validation/formControlElementOrder.generated.d.ts +13 -0
  222. package/dist/validation/formControlElementOrder.generated.js +1705 -0
  223. package/dist/validation/formControlElementOrder.js +227 -0
  224. package/dist/workspace/contextSnapshot.d.ts +17 -2
  225. package/dist/workspace/contextSnapshot.js +105 -24
  226. package/dist/workspace/workspaceScanner.d.ts +1 -1
  227. package/dist/workspace/workspaceScanner.js +1 -1
  228. package/package.json +8 -3
  229. package/scripts/extract-bp-catalog.ps1 +52 -13
  230. package/dist/server/toolSchemas/reviewWorkspaceChanges.d.ts +0 -20
  231. package/dist/server/toolSchemas/reviewWorkspaceChanges.js +0 -19
  232. package/dist/server/toolSchemas/triggerDbSync.d.ts +0 -43
  233. package/dist/server/toolSchemas/triggerDbSync.js +0 -30
  234. package/dist/server/toolSchemas/undoLastModification.d.ts +0 -20
  235. package/dist/server/toolSchemas/undoLastModification.js +0 -17
@@ -32,7 +32,7 @@ PowerShell / any terminal command **WILL HANG** in VS 2022 / VS 2026 MCP integra
32
32
  | Plan a new object before creating it | `prepare(mode="create", goal, objectName, objectType)` — returns collision check, naming, EDT/label hints + `groundingToken` |
33
33
  | Create a D365FO object | `d365fo_file(action="create")` (never `create_file`) |
34
34
  | Edit an existing object | `d365fo_file(action="modify")` (applies immediately — confirm in chat first) |
35
- | Revert the last write | `undo_last_modification` |
35
+ | Revert the last write | `d365fo_file(action="undo", filePath)` — git-tracked → checkout HEAD (discards ALL uncommitted changes to that file); untracked → deleted |
36
36
  | Search objects | `search` — multiple via `search(queries[])`, custom-only via `search(scope="extensions")` |
37
37
  | Read any object's metadata | `get_object_info(objectType, name, options?)` — objectType ∈ class/table/form/query/view/enum/edt/report/data-entity/menu-item/service/map/config-key/security-policy/macro. 2+ known names: `get_object_info(objects=[{objectType,objectName},…])` — ONE call, never a loop |
38
38
  | Method signature for CoC | `get_object_info(objectType="class", name, options={method, include:"signature"})` (already returned by `prepare(mode="change")`) |
@@ -41,7 +41,7 @@ PowerShell / any terminal command **WILL HANG** in VS 2022 / VS 2026 MCP integra
41
41
  | Create a NEW form | `object_patterns(domain="form", action="analyze", recommend={...})` → `object_patterns(domain="form", action="spec", pattern)` → `generate_object(mode="scaffold", objectType="form", cloneFrom=referenceForm, tableMapping={...})` → `object_patterns(domain="form", action="validate", xml)` |
42
42
  | Validate form XML against its pattern | `object_patterns(domain="form", action="validate", xml \| formName \| filePath)` — structural errors block form writes (FORM_PATTERN_ENFORCE) |
43
43
  | Resolve label / EDT / class refs | `validate_code(mode="references", code)` |
44
- | Build / BP / Sync | `build_d365fo_project` / `run_bp_check` / `trigger_db_sync` |
44
+ | Build / BP / Sync | `build_d365fo_project(bpCheck: true, dbSync: true)` — ONE call compiles, runs the best-practice check and syncs AxDB |
45
45
  | Error diagnosis | `get_knowledge(kind="error", errorText)` |
46
46
  | Parameters for a `d365fo_file` operation / `generate_object` mode | `get_knowledge(kind="op-spec", topic="add-index" \| "table" \| "scaffold:form")` — those two tools keep their parameters OUT of the tool schema; look the contract up once for the operation you picked, then nest the values in `params` (`properties` for `action="create"`) |
47
47
 
@@ -53,7 +53,7 @@ PowerShell / any terminal command **WILL HANG** in VS 2022 / VS 2026 MCP integra
53
53
 
54
54
  ### Writes & file editing
55
55
 
56
- 2. **`d365fo_file` (action=create/modify) applies immediately** (no dry-run / preview). Describe the change in chat and wait for explicit user confirmation ("apply", "ok", "yes") before calling. Revert with `undo_last_modification` (or pass `createBackup=true` to keep a `.bak`).
56
+ 2. **`d365fo_file` (action=create/modify) applies immediately** (no dry-run / preview). Describe the change in chat and wait for explicit user confirmation ("apply", "ok", "yes") before calling. Revert with `d365fo_file(action="undo")` (or pass `createBackup=true` to keep a `.bak`).
57
57
  3. **Never** use `replace_string_in_file`, `edit_file`, `apply_patch`, or any built-in file-write tool on `.xml` or `.xpp` files — **not even as a fallback** when `d365fo_file(action="modify")` fails. These bypass `IMetadataProvider` and corrupt VS 2022's in-memory model. If `d365fo_file(action="modify")` errors, STOP and report the error verbatim.
58
58
 
59
59
  ### Build automation
@@ -78,7 +78,7 @@ PowerShell / any terminal command **WILL HANG** in VS 2022 / VS 2026 MCP integra
78
78
  ### Reuse & diff safety
79
79
 
80
80
  10. **Reuse before creating** — `prepare(mode="change")` lists existing CoC wrappers and event handlers. If an extension or handler class in the custom model already owns the target, add the new method there. Never create a parallel feature-named class (`<Target>_<Feature>_Extension`, `<Form>_<Feature>_EH`) unless the user explicitly asks for a separate class. The suffix comes from `EXTENSION_NAMING_STYLE` / existing artifacts — never from feature, ticket, or customer names; if it cannot be derived, ask.
81
- 11. **The post-write diff must be additive or narrowly targeted** — verify via `review_workspace_changes` (or re-read with `get_*_info`) that no unrelated XML nodes (`<DataSources>`, `<Controls>`, methods, pattern metadata) disappeared. If they did, the edit failed: `undo_last_modification`.
81
+ 11. **The post-write diff must be additive or narrowly targeted** — verify via `get_workspace_info(changes=true)` (or re-read with `get_object_info`) that no unrelated XML nodes (`<DataSources>`, `<Controls>`, methods, pattern metadata) disappeared. If they did, the edit failed: `d365fo_file(action="undo")`.
82
82
  12. **An example form named by the user is a pattern contract** — keep its pattern family and required scaffolding (datasources, ActionPane/Tab/grid/QuickFilter); missing pattern elements are a failed generation even if the XML is well-formed.
83
83
 
84
84
  ### Spending tool calls
package/README.md CHANGED
@@ -2,13 +2,13 @@
2
2
 
3
3
  <div align="center">
4
4
 
5
- **23 AI tools that know every X++ class, table, form, and EDT in your D365FO codebase**
5
+ **20 AI tools that know every X++ class, table, form, and EDT in your D365FO codebase**
6
6
 
7
7
  [![npm](https://img.shields.io/npm/v/d365fo-mcp.svg?logo=npm&color=cb3837)](https://www.npmjs.com/package/d365fo-mcp)
8
8
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
9
9
  [![Node.js](https://img.shields.io/badge/node-%3E%3D24.0.0-brightgreen.svg)](https://nodejs.org/)
10
10
  [![TypeScript](https://img.shields.io/badge/TypeScript-7.0-blue.svg)](https://www.typescriptlang.org/)
11
- [![Tests](https://img.shields.io/badge/tests-2800%2B-brightgreen.svg)](docs/TESTING.md)
11
+ [![Tests](https://img.shields.io/badge/tests-5000%2B-brightgreen.svg)](docs/TESTING.md)
12
12
  <!-- coverage-badge:start -->
13
13
  [![Core coverage](https://img.shields.io/badge/core_coverage-100%25-brightgreen.svg)](eval/COVERAGE.md) [![Total coverage](https://img.shields.io/badge/total_coverage-100%25-lightgrey.svg)](eval/COVERAGE.md)
14
14
  <!-- coverage-badge:end -->
@@ -29,7 +29,7 @@
29
29
 
30
30
  AI assistants excel at C#, Python, and JavaScript. X++ is different: your D365FO codebase is private, deeply customized, and invisible to every model — so AI confidently generates code that doesn't compile.
31
31
 
32
- This server pre-indexes your entire D365FO installation (580 000+ symbols across standard, ISV, and custom models) and exposes it as 23 specialized MCP tools. Every signature, every CoC wrapper, every label, every form pattern — verified against your real metadata **before** the AI writes a single line.
32
+ This server pre-indexes your entire D365FO installation (580 000+ symbols across standard, ISV, and custom models) and exposes it as 20 specialized MCP tools. Every signature, every CoC wrapper, every label, every form pattern — verified against your real metadata **before** the AI writes a single line.
33
33
 
34
34
  ![Solution Architecture](docs/img/solution-architecture-diagram.svg)
35
35
 
@@ -115,7 +115,7 @@ Deployment guide: [docs/SETUP_AZURE.md](docs/SETUP_AZURE.md) — includes CI/CD
115
115
 
116
116
  | Getting started | Reference | Operations |
117
117
  |-----------------|-----------|------------|
118
- | [Quick Start](docs/QUICK_START.md) — connect or install | [All 23 tools](docs/MCP_TOOLS.md) | [Azure deployment](docs/SETUP_AZURE.md) |
118
+ | [Quick Start](docs/QUICK_START.md) — connect or install | [All 20 tools](docs/MCP_TOOLS.md) | [Azure deployment](docs/SETUP_AZURE.md) |
119
119
  | [Setup scenarios A–F](docs/SETUP.md) | [`.mcp.json` reference](docs/MCP_CONFIG.md) | [DevOps pipelines](docs/SETUP_AZURE.md#azure-devops-pipelines) |
120
120
  | [Claude Code setup](docs/SETUP.md#claude-code-cli) | [Configuration](docs/CONFIGURATION.md) | [Testing](docs/TESTING.md) |
121
121
  | [Usage examples](docs/USAGE_EXAMPLES.md) — real tool chains | [Architecture](docs/ARCHITECTURE.md) | [Custom / ISV models](docs/CUSTOM_EXTENSIONS.md) |
@@ -255,6 +255,18 @@ namespace D365MetadataBridge.Models
255
255
  [JsonPropertyName("extends")]
256
256
  public string? Extends { get; set; }
257
257
 
258
+ /// <summary>
259
+ /// Root of the Extends chain. Reported for orientation in a multi-level hierarchy; it is
260
+ /// not necessarily the element that declares the StringSize -- see StringSizeInheritedFrom
261
+ /// for that.
262
+ ///
263
+ /// Null for a root EDT, and also null when the chain could not be walked to its end -- a
264
+ /// dangling Extends or a cycle -- because the last ancestor reached is not the root and
265
+ /// naming it as one would be a wrong answer rather than a missing one.
266
+ /// </summary>
267
+ [JsonPropertyName("rootEdt")]
268
+ public string? RootEdt { get; set; }
269
+
258
270
  [JsonPropertyName("label")]
259
271
  public string? Label { get; set; }
260
272
 
@@ -264,6 +276,14 @@ namespace D365MetadataBridge.Models
264
276
  [JsonPropertyName("stringSize")]
265
277
  public int? StringSize { get; set; }
266
278
 
279
+ /// <summary>
280
+ /// Ancestor the reported StringSize came from. Null when the number is what this EDT's
281
+ /// own XML declares. Set both when the EDT declares nothing (the common case) and when
282
+ /// an ancestor's value overrode one the EDT did declare.
283
+ /// </summary>
284
+ [JsonPropertyName("stringSizeInheritedFrom")]
285
+ public string? StringSizeInheritedFrom { get; set; }
286
+
267
287
  [JsonPropertyName("referenceTable")]
268
288
  public string? ReferenceTable { get; set; }
269
289