attio-mcp 1.3.6 → 1.4.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 (293) hide show
  1. package/CHANGELOG.md +236 -2
  2. package/README.md +106 -266
  3. package/dist/api/attio-client.d.ts +13 -3
  4. package/dist/api/attio-client.d.ts.map +1 -1
  5. package/dist/api/attio-client.js +37 -7
  6. package/dist/api/attio-client.js.map +1 -1
  7. package/dist/api/attribute-types.d.ts.map +1 -1
  8. package/dist/api/attribute-types.js +42 -20
  9. package/dist/api/attribute-types.js.map +1 -1
  10. package/dist/api/client-context.d.ts.map +1 -1
  11. package/dist/api/client-context.js +28 -42
  12. package/dist/api/client-context.js.map +1 -1
  13. package/dist/cli/commands/generate-skill.d.ts +28 -0
  14. package/dist/cli/commands/generate-skill.d.ts.map +1 -0
  15. package/dist/cli/commands/generate-skill.js +101 -0
  16. package/dist/cli/commands/generate-skill.js.map +1 -0
  17. package/dist/cli/discover.js +65 -0
  18. package/dist/cli/discover.js.map +1 -1
  19. package/dist/config/deal-defaults.d.ts +2 -2
  20. package/dist/config/deal-defaults.d.ts.map +1 -1
  21. package/dist/config/deal-defaults.js +15 -6
  22. package/dist/config/deal-defaults.js.map +1 -1
  23. package/dist/config/tool-aliases.d.ts +12 -0
  24. package/dist/config/tool-aliases.d.ts.map +1 -1
  25. package/dist/config/tool-aliases.js +213 -69
  26. package/dist/config/tool-aliases.js.map +1 -1
  27. package/dist/constants/tool-names.d.ts +84 -0
  28. package/dist/constants/tool-names.d.ts.map +1 -0
  29. package/dist/constants/tool-names.js +81 -0
  30. package/dist/constants/tool-names.js.map +1 -0
  31. package/dist/constants/universal.constants.d.ts +24 -0
  32. package/dist/constants/universal.constants.d.ts.map +1 -1
  33. package/dist/constants/universal.constants.js +81 -9
  34. package/dist/constants/universal.constants.js.map +1 -1
  35. package/dist/handlers/tool-configs/universal/batch-search.js +4 -4
  36. package/dist/handlers/tool-configs/universal/core/crud-error-handlers.d.ts +26 -4
  37. package/dist/handlers/tool-configs/universal/core/crud-error-handlers.d.ts.map +1 -1
  38. package/dist/handlers/tool-configs/universal/core/crud-error-handlers.js +181 -21
  39. package/dist/handlers/tool-configs/universal/core/crud-error-handlers.js.map +1 -1
  40. package/dist/handlers/tool-configs/universal/core/crud-operations.js +13 -13
  41. package/dist/handlers/tool-configs/universal/core/crud-operations.js.map +1 -1
  42. package/dist/handlers/tool-configs/universal/core/detailed-info-operations.js +3 -3
  43. package/dist/handlers/tool-configs/universal/core/detailed-info-operations.js.map +1 -1
  44. package/dist/handlers/tool-configs/universal/core/error-enhancers/attribute-enhancer.d.ts +17 -0
  45. package/dist/handlers/tool-configs/universal/core/error-enhancers/attribute-enhancer.d.ts.map +1 -0
  46. package/dist/handlers/tool-configs/universal/core/error-enhancers/attribute-enhancer.js +118 -0
  47. package/dist/handlers/tool-configs/universal/core/error-enhancers/attribute-enhancer.js.map +1 -0
  48. package/dist/handlers/tool-configs/universal/core/error-enhancers/complex-type-enhancer.d.ts +14 -0
  49. package/dist/handlers/tool-configs/universal/core/error-enhancers/complex-type-enhancer.d.ts.map +1 -0
  50. package/dist/handlers/tool-configs/universal/core/error-enhancers/complex-type-enhancer.js +77 -0
  51. package/dist/handlers/tool-configs/universal/core/error-enhancers/complex-type-enhancer.js.map +1 -0
  52. package/dist/handlers/tool-configs/universal/core/error-enhancers/index.d.ts +24 -0
  53. package/dist/handlers/tool-configs/universal/core/error-enhancers/index.d.ts.map +1 -0
  54. package/dist/handlers/tool-configs/universal/core/error-enhancers/index.js +35 -0
  55. package/dist/handlers/tool-configs/universal/core/error-enhancers/index.js.map +1 -0
  56. package/dist/handlers/tool-configs/universal/core/error-enhancers/record-reference-enhancer.d.ts +15 -0
  57. package/dist/handlers/tool-configs/universal/core/error-enhancers/record-reference-enhancer.d.ts.map +1 -0
  58. package/dist/handlers/tool-configs/universal/core/error-enhancers/record-reference-enhancer.js +108 -0
  59. package/dist/handlers/tool-configs/universal/core/error-enhancers/record-reference-enhancer.js.map +1 -0
  60. package/dist/handlers/tool-configs/universal/core/error-enhancers/required-fields-enhancer.d.ts +14 -0
  61. package/dist/handlers/tool-configs/universal/core/error-enhancers/required-fields-enhancer.d.ts.map +1 -0
  62. package/dist/handlers/tool-configs/universal/core/error-enhancers/required-fields-enhancer.js +91 -0
  63. package/dist/handlers/tool-configs/universal/core/error-enhancers/required-fields-enhancer.js.map +1 -0
  64. package/dist/handlers/tool-configs/universal/core/error-enhancers/select-status-enhancer.d.ts +14 -0
  65. package/dist/handlers/tool-configs/universal/core/error-enhancers/select-status-enhancer.d.ts.map +1 -0
  66. package/dist/handlers/tool-configs/universal/core/error-enhancers/select-status-enhancer.js +118 -0
  67. package/dist/handlers/tool-configs/universal/core/error-enhancers/select-status-enhancer.js.map +1 -0
  68. package/dist/handlers/tool-configs/universal/core/error-enhancers/types.d.ts +77 -0
  69. package/dist/handlers/tool-configs/universal/core/error-enhancers/types.d.ts.map +1 -0
  70. package/dist/handlers/tool-configs/universal/core/error-enhancers/types.js +42 -0
  71. package/dist/handlers/tool-configs/universal/core/error-enhancers/types.js.map +1 -0
  72. package/dist/handlers/tool-configs/universal/core/error-enhancers/uniqueness-enhancer.d.ts +15 -0
  73. package/dist/handlers/tool-configs/universal/core/error-enhancers/uniqueness-enhancer.d.ts.map +1 -0
  74. package/dist/handlers/tool-configs/universal/core/error-enhancers/uniqueness-enhancer.js +109 -0
  75. package/dist/handlers/tool-configs/universal/core/error-enhancers/uniqueness-enhancer.js.map +1 -0
  76. package/dist/handlers/tool-configs/universal/core/index.d.ts +63 -22
  77. package/dist/handlers/tool-configs/universal/core/index.d.ts.map +1 -1
  78. package/dist/handlers/tool-configs/universal/core/index.js +24 -22
  79. package/dist/handlers/tool-configs/universal/core/index.js.map +1 -1
  80. package/dist/handlers/tool-configs/universal/core/metadata-operations.d.ts +43 -1
  81. package/dist/handlers/tool-configs/universal/core/metadata-operations.d.ts.map +1 -1
  82. package/dist/handlers/tool-configs/universal/core/metadata-operations.js +117 -11
  83. package/dist/handlers/tool-configs/universal/core/metadata-operations.js.map +1 -1
  84. package/dist/handlers/tool-configs/universal/core/notes-operations.js +12 -12
  85. package/dist/handlers/tool-configs/universal/core/notes-operations.js.map +1 -1
  86. package/dist/handlers/tool-configs/universal/core/record-details-operations.js +3 -3
  87. package/dist/handlers/tool-configs/universal/core/record-details-operations.js.map +1 -1
  88. package/dist/handlers/tool-configs/universal/core/search-operations.js +4 -4
  89. package/dist/handlers/tool-configs/universal/core/search-operations.js.map +1 -1
  90. package/dist/handlers/tool-configs/universal/field-mapper/constants/companies.d.ts.map +1 -1
  91. package/dist/handlers/tool-configs/universal/field-mapper/constants/companies.js +32 -9
  92. package/dist/handlers/tool-configs/universal/field-mapper/constants/companies.js.map +1 -1
  93. package/dist/handlers/tool-configs/universal/field-mapper/constants/deals.d.ts.map +1 -1
  94. package/dist/handlers/tool-configs/universal/field-mapper/constants/deals.js +45 -6
  95. package/dist/handlers/tool-configs/universal/field-mapper/constants/deals.js.map +1 -1
  96. package/dist/handlers/tool-configs/universal/field-mapper/constants/people.d.ts.map +1 -1
  97. package/dist/handlers/tool-configs/universal/field-mapper/constants/people.js +36 -5
  98. package/dist/handlers/tool-configs/universal/field-mapper/constants/people.js.map +1 -1
  99. package/dist/handlers/tool-configs/universal/field-mapper/transformers/value-transformer.d.ts +1 -1
  100. package/dist/handlers/tool-configs/universal/field-mapper/transformers/value-transformer.d.ts.map +1 -1
  101. package/dist/handlers/tool-configs/universal/field-mapper/transformers/value-transformer.js +17 -1
  102. package/dist/handlers/tool-configs/universal/field-mapper/transformers/value-transformer.js.map +1 -1
  103. package/dist/handlers/tool-configs/universal/field-mapper/validators/field-validator.d.ts.map +1 -1
  104. package/dist/handlers/tool-configs/universal/field-mapper/validators/field-validator.js +3 -1
  105. package/dist/handlers/tool-configs/universal/field-mapper/validators/field-validator.js.map +1 -1
  106. package/dist/handlers/tool-configs/universal/index.d.ts +75 -34
  107. package/dist/handlers/tool-configs/universal/index.d.ts.map +1 -1
  108. package/dist/handlers/tool-configs/universal/index.js +58 -58
  109. package/dist/handlers/tool-configs/universal/index.js.map +1 -1
  110. package/dist/handlers/tool-configs/universal/operations/advanced-search.d.ts.map +1 -1
  111. package/dist/handlers/tool-configs/universal/operations/advanced-search.js +5 -4
  112. package/dist/handlers/tool-configs/universal/operations/advanced-search.js.map +1 -1
  113. package/dist/handlers/tool-configs/universal/operations/batch-operations.js +3 -3
  114. package/dist/handlers/tool-configs/universal/operations/content-search.js +3 -3
  115. package/dist/handlers/tool-configs/universal/operations/index.d.ts +10 -10
  116. package/dist/handlers/tool-configs/universal/operations/index.js +15 -15
  117. package/dist/handlers/tool-configs/universal/operations/relationship-search.js +3 -3
  118. package/dist/handlers/tool-configs/universal/operations/timeframe-search.js +3 -3
  119. package/dist/handlers/tool-configs/universal/schemas/utility-schemas.d.ts.map +1 -1
  120. package/dist/handlers/tool-configs/universal/schemas/utility-schemas.js +5 -2
  121. package/dist/handlers/tool-configs/universal/schemas/utility-schemas.js.map +1 -1
  122. package/dist/handlers/tool-configs/universal/schemas/validation-schemas.d.ts +29 -0
  123. package/dist/handlers/tool-configs/universal/schemas/validation-schemas.d.ts.map +1 -1
  124. package/dist/handlers/tool-configs/universal/schemas/validation-schemas.js +28 -0
  125. package/dist/handlers/tool-configs/universal/schemas/validation-schemas.js.map +1 -1
  126. package/dist/handlers/tool-configs/universal/schemas.d.ts +1 -1
  127. package/dist/handlers/tool-configs/universal/schemas.d.ts.map +1 -1
  128. package/dist/handlers/tool-configs/universal/schemas.js +1 -1
  129. package/dist/handlers/tool-configs/universal/schemas.js.map +1 -1
  130. package/dist/handlers/tool-configs/universal/shared-handlers.d.ts +20 -1
  131. package/dist/handlers/tool-configs/universal/shared-handlers.d.ts.map +1 -1
  132. package/dist/handlers/tool-configs/universal/shared-handlers.js +216 -0
  133. package/dist/handlers/tool-configs/universal/shared-handlers.js.map +1 -1
  134. package/dist/handlers/tool-configs/universal/smithery-diagnostics.js +2 -2
  135. package/dist/handlers/tool-configs/universal/types.d.ts +9 -0
  136. package/dist/handlers/tool-configs/universal/types.d.ts.map +1 -1
  137. package/dist/handlers/tool-configs/universal/validators/schema-validator.d.ts +11 -0
  138. package/dist/handlers/tool-configs/universal/validators/schema-validator.d.ts.map +1 -1
  139. package/dist/handlers/tool-configs/universal/validators/schema-validator.js +63 -9
  140. package/dist/handlers/tool-configs/universal/validators/schema-validator.js.map +1 -1
  141. package/dist/handlers/tools/dispatcher/core.d.ts.map +1 -1
  142. package/dist/handlers/tools/dispatcher/core.js +5 -1
  143. package/dist/handlers/tools/dispatcher/core.js.map +1 -1
  144. package/dist/handlers/tools/formatters.d.ts +8 -1
  145. package/dist/handlers/tools/formatters.d.ts.map +1 -1
  146. package/dist/handlers/tools/formatters.js +30 -14
  147. package/dist/handlers/tools/formatters.js.map +1 -1
  148. package/dist/handlers/tools/registry.d.ts +125 -84
  149. package/dist/handlers/tools/registry.d.ts.map +1 -1
  150. package/dist/handlers/tools/registry.js +14 -9
  151. package/dist/handlers/tools/registry.js.map +1 -1
  152. package/dist/handlers/tools/standards/index.d.ts.map +1 -1
  153. package/dist/handlers/tools/standards/index.js +19 -11
  154. package/dist/handlers/tools/standards/index.js.map +1 -1
  155. package/dist/objects/companies/attributes.d.ts +5 -0
  156. package/dist/objects/companies/attributes.d.ts.map +1 -1
  157. package/dist/objects/companies/attributes.js +45 -31
  158. package/dist/objects/companies/attributes.js.map +1 -1
  159. package/dist/server/createServer.d.ts.map +1 -1
  160. package/dist/server/createServer.js +4 -3
  161. package/dist/server/createServer.js.map +1 -1
  162. package/dist/services/ErrorService.js +3 -3
  163. package/dist/services/ErrorService.js.map +1 -1
  164. package/dist/services/UniversalCreateService.d.ts.map +1 -1
  165. package/dist/services/UniversalCreateService.js +136 -12
  166. package/dist/services/UniversalCreateService.js.map +1 -1
  167. package/dist/services/UniversalSearchService.d.ts +4 -25
  168. package/dist/services/UniversalSearchService.d.ts.map +1 -1
  169. package/dist/services/UniversalSearchService.js +14 -324
  170. package/dist/services/UniversalSearchService.js.map +1 -1
  171. package/dist/services/UniversalUpdateService.d.ts +15 -4
  172. package/dist/services/UniversalUpdateService.d.ts.map +1 -1
  173. package/dist/services/UniversalUpdateService.js +79 -151
  174. package/dist/services/UniversalUpdateService.js.map +1 -1
  175. package/dist/services/create/factory.d.ts.map +1 -1
  176. package/dist/services/create/factory.js +2 -1
  177. package/dist/services/create/factory.js.map +1 -1
  178. package/dist/services/metadata/AttributeOptionsService.d.ts +38 -0
  179. package/dist/services/metadata/AttributeOptionsService.d.ts.map +1 -0
  180. package/dist/services/metadata/AttributeOptionsService.js +92 -0
  181. package/dist/services/metadata/AttributeOptionsService.js.map +1 -0
  182. package/dist/services/metadata/index.d.ts +1 -0
  183. package/dist/services/metadata/index.d.ts.map +1 -1
  184. package/dist/services/metadata/index.js +1 -0
  185. package/dist/services/metadata/index.js.map +1 -1
  186. package/dist/services/search/QueryApiService.d.ts +27 -0
  187. package/dist/services/search/QueryApiService.d.ts.map +1 -0
  188. package/dist/services/search/QueryApiService.js +144 -0
  189. package/dist/services/search/QueryApiService.js.map +1 -0
  190. package/dist/services/search/RecordsSearchService.d.ts +27 -0
  191. package/dist/services/search/RecordsSearchService.d.ts.map +1 -0
  192. package/dist/services/search/RecordsSearchService.js +122 -0
  193. package/dist/services/search/RecordsSearchService.js.map +1 -0
  194. package/dist/services/search/SearchCoordinator.d.ts +41 -0
  195. package/dist/services/search/SearchCoordinator.d.ts.map +1 -0
  196. package/dist/services/search/SearchCoordinator.js +83 -0
  197. package/dist/services/search/SearchCoordinator.js.map +1 -0
  198. package/dist/services/search/StrategyFactory.d.ts +31 -0
  199. package/dist/services/search/StrategyFactory.d.ts.map +1 -0
  200. package/dist/services/search/StrategyFactory.js +100 -0
  201. package/dist/services/search/StrategyFactory.js.map +1 -0
  202. package/dist/services/skill-generator/OutputWriterService.d.ts +41 -0
  203. package/dist/services/skill-generator/OutputWriterService.d.ts.map +1 -0
  204. package/dist/services/skill-generator/OutputWriterService.js +100 -0
  205. package/dist/services/skill-generator/OutputWriterService.js.map +1 -0
  206. package/dist/services/skill-generator/SchemaFormatterService.d.ts +61 -0
  207. package/dist/services/skill-generator/SchemaFormatterService.d.ts.map +1 -0
  208. package/dist/services/skill-generator/SchemaFormatterService.js +168 -0
  209. package/dist/services/skill-generator/SchemaFormatterService.js.map +1 -0
  210. package/dist/services/skill-generator/WorkspaceSchemaService.d.ts +84 -0
  211. package/dist/services/skill-generator/WorkspaceSchemaService.d.ts.map +1 -0
  212. package/dist/services/skill-generator/WorkspaceSchemaService.js +292 -0
  213. package/dist/services/skill-generator/WorkspaceSchemaService.js.map +1 -0
  214. package/dist/services/skill-generator/index.d.ts +12 -0
  215. package/dist/services/skill-generator/index.d.ts.map +1 -0
  216. package/dist/services/skill-generator/index.js +11 -0
  217. package/dist/services/skill-generator/index.js.map +1 -0
  218. package/dist/services/skill-generator/types.d.ts +137 -0
  219. package/dist/services/skill-generator/types.d.ts.map +1 -0
  220. package/dist/services/skill-generator/types.js +10 -0
  221. package/dist/services/skill-generator/types.js.map +1 -0
  222. package/dist/services/update/FieldPersistenceHandler.d.ts +101 -0
  223. package/dist/services/update/FieldPersistenceHandler.d.ts.map +1 -0
  224. package/dist/services/update/FieldPersistenceHandler.js +198 -0
  225. package/dist/services/update/FieldPersistenceHandler.js.map +1 -0
  226. package/dist/services/update/FieldValidationHandler.d.ts +77 -0
  227. package/dist/services/update/FieldValidationHandler.d.ts.map +1 -0
  228. package/dist/services/update/FieldValidationHandler.js +157 -0
  229. package/dist/services/update/FieldValidationHandler.js.map +1 -0
  230. package/dist/services/update/MetadataResolver.d.ts +50 -0
  231. package/dist/services/update/MetadataResolver.d.ts.map +1 -0
  232. package/dist/services/update/MetadataResolver.js +110 -0
  233. package/dist/services/update/MetadataResolver.js.map +1 -0
  234. package/dist/services/update/UpdateOrchestrator.d.ts +37 -0
  235. package/dist/services/update/UpdateOrchestrator.d.ts.map +1 -0
  236. package/dist/services/update/UpdateOrchestrator.js +58 -0
  237. package/dist/services/update/UpdateOrchestrator.js.map +1 -0
  238. package/dist/services/update/UpdateValidation.d.ts +5 -1
  239. package/dist/services/update/UpdateValidation.d.ts.map +1 -1
  240. package/dist/services/update/UpdateValidation.js +46 -14
  241. package/dist/services/update/UpdateValidation.js.map +1 -1
  242. package/dist/services/value-transformer/index.d.ts +57 -0
  243. package/dist/services/value-transformer/index.d.ts.map +1 -0
  244. package/dist/services/value-transformer/index.js +326 -0
  245. package/dist/services/value-transformer/index.js.map +1 -0
  246. package/dist/services/value-transformer/multi-select-transformer.d.ts +63 -0
  247. package/dist/services/value-transformer/multi-select-transformer.d.ts.map +1 -0
  248. package/dist/services/value-transformer/multi-select-transformer.js +144 -0
  249. package/dist/services/value-transformer/multi-select-transformer.js.map +1 -0
  250. package/dist/services/value-transformer/record-reference-transformer.d.ts +43 -0
  251. package/dist/services/value-transformer/record-reference-transformer.d.ts.map +1 -0
  252. package/dist/services/value-transformer/record-reference-transformer.js +245 -0
  253. package/dist/services/value-transformer/record-reference-transformer.js.map +1 -0
  254. package/dist/services/value-transformer/select-transformer.d.ts +48 -0
  255. package/dist/services/value-transformer/select-transformer.d.ts.map +1 -0
  256. package/dist/services/value-transformer/select-transformer.js +232 -0
  257. package/dist/services/value-transformer/select-transformer.js.map +1 -0
  258. package/dist/services/value-transformer/status-transformer.d.ts +32 -0
  259. package/dist/services/value-transformer/status-transformer.d.ts.map +1 -0
  260. package/dist/services/value-transformer/status-transformer.js +294 -0
  261. package/dist/services/value-transformer/status-transformer.js.map +1 -0
  262. package/dist/services/value-transformer/types.d.ts +100 -0
  263. package/dist/services/value-transformer/types.d.ts.map +1 -0
  264. package/dist/services/value-transformer/types.js +6 -0
  265. package/dist/services/value-transformer/types.js.map +1 -0
  266. package/dist/templates/skill/SKILL.template.md +78 -0
  267. package/dist/templates/skill/attribute-reference.template.md +126 -0
  268. package/dist/templates/skill/complex-types.template.md +255 -0
  269. package/dist/utils/client-resolver.d.ts.map +1 -1
  270. package/dist/utils/client-resolver.js +8 -16
  271. package/dist/utils/client-resolver.js.map +1 -1
  272. package/dist/utils/complex-type-validation.d.ts +16 -0
  273. package/dist/utils/complex-type-validation.d.ts.map +1 -0
  274. package/dist/utils/complex-type-validation.js +196 -0
  275. package/dist/utils/complex-type-validation.js.map +1 -0
  276. package/dist/utils/error-utilities.d.ts.map +1 -1
  277. package/dist/utils/error-utilities.js +16 -9
  278. package/dist/utils/error-utilities.js.map +1 -1
  279. package/dist/utils/location-normalizer.d.ts +26 -0
  280. package/dist/utils/location-normalizer.d.ts.map +1 -0
  281. package/dist/utils/location-normalizer.js +39 -0
  282. package/dist/utils/location-normalizer.js.map +1 -0
  283. package/dist/utils/metadata-utils.d.ts +27 -0
  284. package/dist/utils/metadata-utils.d.ts.map +1 -0
  285. package/dist/utils/metadata-utils.js +59 -0
  286. package/dist/utils/metadata-utils.js.map +1 -0
  287. package/dist/utils/personal-name-parser.d.ts.map +1 -1
  288. package/dist/utils/personal-name-parser.js +26 -17
  289. package/dist/utils/personal-name-parser.js.map +1 -1
  290. package/dist/validators/company/field_detector.d.ts.map +1 -1
  291. package/dist/validators/company/field_detector.js +5 -0
  292. package/dist/validators/company/field_detector.js.map +1 -1
  293. package/package.json +13 -11
package/CHANGELOG.md CHANGED
@@ -7,18 +7,252 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
- ### Breaking Changes
10
+ ## [1.4.0] - 2025-12-29
11
+
12
+ **TL;DR for Users**: New workspace skill generator, better select field handling, MCP-compliant tool naming. **No action needed** - old tool names still work via backward-compatible aliases until v2.0.0 (Q1 2026). See [Migration Guide](./docs/MIGRATION-GUIDE.md) for future planning.
11
13
 
12
14
  ### Added
13
15
 
16
+ - **Workspace Schema Skill Generator** (#983) - Auto-generate Claude Skills from Attio workspace schemas
17
+ - New CLI command `attio-discover generate-skill` for generating workspace schema documentation
18
+ - Supports companies, people, and deals (Phase 1 objects) with experimental support for custom objects
19
+ - Three output formats: Claude Skill (SKILL.md + resources/), Markdown (single file), and JSON
20
+ - Prominent Display Name ↔ API Slug mapping tables to address #1 LLM error source
21
+ - Select/status option values with 20-item truncation and "(+N more)" indicators
22
+ - Complex type structure documentation (location, personal-name, phone-number, email-address)
23
+ - Multi-select, unique, and required field indicators for accurate attribute usage
24
+ - ZIP packaging support (--zip flag) for easy Claude desktop upload
25
+ - Graceful error handling with partial data generation when individual objects fail
26
+ - Handlebars-based templating for clean separation of logic and presentation
27
+ - Security validation prevents directory traversal attacks
28
+ - Comprehensive unit tests for all services (45 tests total)
29
+
30
+ - **Universal Usage Guide Skill** (#1018) - Hand-crafted skill for workflow patterns and error prevention
31
+ - Universal workflow patterns (Find or Create, Batch Update, Pipeline Movement, Data Enrichment)
32
+ - Golden Rules error prevention system (read-only fields, multi-select arrays, data types, UUID validation)
33
+ - Complete MCP tool reference with signatures and examples for all tools
34
+ - Integration patterns for deals pipeline, list-based organization, lead qualification, bulk import
35
+ - Object-agnostic design supporting companies, deals, people, lists, and custom objects
36
+ - Cross-references to attio-workspace-schema skill for workspace-specific details
37
+ - Two-skill architecture: Schema skill (WHAT) + Usage skill (HOW)
38
+
39
+ - **Select-field Transformer** (#1019, #1029) - Quality-of-life enhancement for select field values
40
+ - Case-insensitive title matching: `"potential customer"` → `"Potential Customer"`
41
+ - Partial matching support: `"Potential"` → `"Potential Customer"`
42
+ - Better error messages listing valid options with suggestions
43
+ - UUID pass-through support (no API lookup needed)
44
+ - 5-minute TTL caching to minimize API calls
45
+ - Consistent UX with existing status-transformer
46
+
47
+ - **`records_get_attribute_options` tool** (#975) - Get valid options for select, status, and multi-select attributes
48
+ - Prevents "Cannot find select option" errors by showing available options upfront
49
+ - Works with companies, people, deals, and custom objects
50
+ - Returns option titles, IDs, and active/archived status
51
+
52
+ - **Comprehensive FieldPersistenceHandler tests** (#984) - 50 new unit tests
53
+ - Optional actualRecord parameter behavior (10 tests)
54
+ - Verification modes: disabled, warn-only, strict (15 tests)
55
+ - Semantic vs cosmetic mismatch filtering (15 tests)
56
+ - Integration with UpdateValidation (10 tests)
57
+ - Increases total test count from 2973 to 3026 (+53 tests)
58
+
59
+ - **Configurable skill generator option fetch delay** (#1015, #1024) - New `--option-fetch-delay` flag to tune rate limiting between option fetches
60
+
61
+ - **Attio skill generator meta-skill** (#1020, #1024) - Meta-skill for generating workspace schema documentation
62
+
63
+ - **Phone validation to @attio-mcp/core** (#951, #964) - Extracted phone number validation into dedicated package
64
+ - New `@attio-mcp/core` package with phone validation utilities
65
+ - E.164 format support with international dialing code parsing
66
+ - Reusable validation logic for phone number attributes across the codebase
67
+
14
68
  ### Changed
15
69
 
70
+ - **Extract search services from UniversalSearchService** (#935, #974) - Improved search architecture and maintainability
71
+ - Created dedicated strategy classes: CompanySearchStrategy, PeopleSearchStrategy, NoteSearchStrategy, TaskSearchStrategy
72
+ - Extracted common search patterns into BaseSearchStrategy abstract class
73
+ - Reduced code duplication and improved testability
74
+ - Better separation of concerns for resource-specific search logic
75
+
76
+ - **Transformation type rename** (#1055) - Renamed transformation type for clarity
77
+ - Renamed `select_title_to_id` to `select_title_to_array` to better reflect array-based format
78
+ - Maintains consistency with Attio API's array-based select field expectations
79
+
80
+ - **Tool alias system refactoring** (#1041) - Simplified and improved maintainability of the tool alias system
81
+ - Created `src/constants/tool-names.ts` with type-safe tool name constants and `ToolName` type
82
+ - Refactored `src/config/tool-aliases.ts` to use data-driven pattern-based alias generation
83
+ - Created `test/utils/tool-assertions.ts` with reusable assertion helpers for tool validation
84
+ - Refactored consistency tests to use assertion helpers, improving readability and reducing duplication
85
+ - All 29 aliases remain fully functional with 100% backward compatibility
86
+
87
+ - **MCP-compliant tool naming** (#1039) - All universal tools now use `snake_case`, verb-first naming
88
+ - Universal search/metadata tools: `records_search` → `search_records`, `records_get_details` → `get_record_details`, etc. (12 tools)
89
+ - CRUD tools: `create-record` → `create_record`, `update-record` → `update_record`, `delete-record` → `delete_record`
90
+ - Note tools: `create-note` → `create_note`, `list-notes` → `list_notes`
91
+ - Debug tool: `smithery-debug-config` → `smithery_debug_config`
92
+ - Tool descriptions now use natural language sentences instead of pipe-separated labels
93
+ - Aligns with MCP ecosystem standards (Desktop Commander, SEP-986, official MCP docs)
94
+ - Old names continue to work via dual alias support (both old `noun_verb` and `kebab-case` formats)
95
+ - See `docs/MIGRATION-GUIDE.md` for complete migration table
96
+
97
+ - **Refactored UniversalUpdateService** (#984) - Reduced from 831 to 691 lines (-17%) by extracting focused modules
98
+ - Created MetadataResolver for centralized metadata fetching (eliminates 40-60% duplicate API calls)
99
+ - Created UpdateOrchestrator for clean strategy dispatch separation
100
+ - Created FieldValidationHandler for validation with display name resolution
101
+ - Created FieldPersistenceHandler for post-update verification
102
+
103
+ - **Unified verification API** (#984) - Single entry point for field persistence verification
104
+ - UniversalUpdateService now routes through FieldPersistenceHandler.verifyPersistence
105
+ - Eliminates duplicate semantic filtering logic (47 lines removed)
106
+ - FieldPersistenceHandler.verifyPersistence now accepts optional actualRecord parameter
107
+ - Verification results surfaced in UpdateMetadata.fieldVerification (verified status + discrepancies)
108
+ - Renamed ValidationResult → UpdateMetadata for clarity (3 competing interfaces reduced to distinct purposes)
109
+
110
+ - **Standardized environment variables** (#984) - Consistent verification configuration
111
+ - UpdateValidation now uses ENABLE_FIELD_VERIFICATION (deprecated SKIP_FIELD_VERIFICATION)
112
+ - Both variables supported for backward compatibility with deprecation notice
113
+
114
+ - **Improved MetadataResolver error handling** (#984, #1006) - Better error handling for critical failures
115
+ - Re-throws critical authentication errors (401, 403, Unauthorized, Forbidden)
116
+ - Re-throws schema validation errors for immediate failure visibility
117
+ - Graceful degradation with empty metadata for non-critical transient errors
118
+ - Prevents silent masking of authentication and validation failures
119
+
120
+ - **Consolidated metadata fetching** (#984, #1006) - Single API call per resource type per request
121
+ - MetadataResolver provides single source of truth for attribute metadata
122
+ - Value transformer receives metadata via context to avoid duplicate fetch
123
+ - Reduces API calls and improves performance
124
+
125
+ - **Extended display name resolution** (#984) - User-friendly field names now work in create/update operations
126
+ - Can use "Deal stage" instead of "stage" in all operations (not just attribute_options)
127
+ - FieldValidationHandler automatically resolves display names before validation
128
+ - Integrated into both UniversalCreateService and UniversalUpdateService
129
+
130
+ - **Added TTL to metadata caches** (#984) - All metadata caches now expire after 5 minutes
131
+ - Value transformer migrated to CachingService with DEFAULT_ATTRIBUTES_CACHE_TTL
132
+ - Status transformer uses timestamp-based expiration with lazy eviction
133
+ - Prevents stale data while maintaining performance benefits
134
+
135
+ - **Enhanced attribute error messages** (#975) - Better guidance when API requests fail
136
+ - Levenshtein distance suggestions for misspelled attribute names (threshold ≤3 edits)
137
+ - Field alias mapping converts common mistakes automatically (`linkedin_url` → `linkedin`)
138
+ - Select/status errors now show valid workspace-specific options
139
+ - Error messages include `records_discover_attributes` hint for discovery
140
+
141
+ - **Expanded valid field lists** (#975) - Validators now accept more standard Attio attributes
142
+ - Companies: `team_size`, `founded_at`, `headquarters`, `crunchbase`, `instagram`, `angellist`, etc.
143
+ - People: `primary_email_address`, `primary_phone_number`, `avatar_url`, `timezone`, `instagram`, etc.
144
+
145
+ - **Location field auto-normalization** (#987) - Incomplete location objects now auto-fill missing fields
146
+ - Attio requires all 10 location fields (`line_1`-`line_4`, `locality`, `region`, `postcode`, `country_code`, `latitude`, `longitude`) even if null
147
+ - Transformer auto-fills missing fields with `null` to prevent validation errors
148
+ - Common aliases supported: `street`→`line_1`, `city`→`locality`, `state`→`region`, `zip`→`postcode`, `lat`→`latitude`
149
+
150
+ - **Refactored select array handling** (#1030) - Normalized select array data structures for consistency
151
+
152
+ - **Removed unused normalizeLocation function** (#1030) - Cleaned up unused code to reduce technical debt
153
+
154
+ - **Error handling refactoring** (#1001) - Extracted validation enhancers for improved code organization and maintainability
155
+ - Extracted required-fields enhancer (Step 1/6)
156
+ - Extracted uniqueness enhancer (Step 2/6)
157
+ - Extracted attribute-not-found enhancer (Step 3/6)
158
+ - Extracted final 3 enhancers (Steps 4-6/6)
159
+
16
160
  ### Fixed
17
161
 
18
- ### Security
162
+ - **Note content line breaks preserved** (#1052) - Fixed line breaks being stripped from note content during sanitization
163
+ - Preserved leading indentation for nested Markdown (bullet lists, code blocks)
164
+ - Added `sanitizeMultilineString()` for content-heavy fields while maintaining XSS security
165
+ - Supports all multiline fields: content, content_markdown, content_plaintext, description, body, notes
166
+ - Enhanced `create_note` tool description with markdown formatting guidance
167
+ - **Action**: Re-generate workspace schema skills to get updated note formatting documentation
168
+
169
+ - **People search results display** (#1051) - Fixed people search showing "Unnamed" instead of actual names
170
+ - Updated `getAttributeValue()` to handle `personal-name` attributes with `full_name`, `first_name`, `last_name` fields
171
+ - Added fallback support for `formatted` attribute values
172
+ - Maintains backward compatibility with standard `value` attributes
173
+
174
+ - **Select field persistence** (#1045) - Fixed silent API failures where select field updates returned 200 OK but didn't persist
175
+ - Fixed `detectFieldType()` to return `'array'` for all select fields (single and multi-select)
176
+ - Fixed select-transformer to use `["title"]` format instead of `["uuid"]` format (Attio silently rejects UUID arrays)
177
+ - Added E2E test validating real API persistence with select fields
178
+ - Resolves type mismatch validation errors and false-positive update confirmations
179
+
180
+ - **Deal creation** (#1043) - Accept stage titles + UTM fields and improve validation/error surfacing
181
+
182
+ - **Field persistence false warnings for status fields** (#995, #1011) - Resolved spurious warnings when updating status field values
183
+ - Fixed unwrapArrayValue to properly handle both status and title field properties
184
+ - Improved isStatusField detection to recognize stage and status field variations
185
+ - Enhanced test coverage for status field update scenarios
186
+ - Resolves confusing warnings after successful updates (e.g., "Sales Qualified" stage updates)
187
+
188
+ - **Enhance uniqueness constraint violation errors** (#990, #1000) - Better error messages for duplicate records
189
+ - Searches for conflicting records and shows field name, conflicting value, and existing record ID
190
+ - Provides actionable options: update existing, view details, or use different value
191
+ - Integrated into handleCreateError() for companies and people records
192
+
193
+ - **Complex attribute validation** (#991) - Clearer validation and error messages for location, personal-name, and phone-number fields
194
+ - Pre-validates complex types with actionable errors and examples before Attio API calls
195
+ - Auto-fills missing location fields with nulls; enforces phone_number/original_phone_number and non-empty names
196
+ - Enhanced CRUD error handling surfaces Attio validation_errors and select/status option hints
197
+
198
+ - **Record-reference fields now auto-format** (#997) - Automatic transformation to Attio's required format
199
+ - String IDs like `company: "uuid"` are auto-converted to `[{target_object: "companies", target_record_id: "uuid"}]`
200
+ - Fixes 400 errors when linking people to companies or associating people with deals
201
+ - Supports legacy formats: `{record_id: "uuid"}`, `{id: "uuid"}`, incomplete objects
202
+ - Target object inferred from field name (`company`→`companies`, `associated_people`→`people`)
203
+
204
+ - **Multi-select fields now accept single values** (#992) - Automatic array wrapping for multi-select attributes
205
+ - Single values like `lead_type: "Inbound"` are now auto-converted to `["Inbound"]`
206
+ - Works for all custom multi-select fields (e.g., `categories`, `inbound_outbound`, `regions`)
207
+ - Fixes "Multi-select attribute expects an array" errors when using natural input format
208
+ - Detects multi-select via Attio's `is_multiselect` flag (not just type name)
209
+
210
+ - **`records_get_attribute_options` now returns status options** (#987) - Fixed empty results for status attributes
211
+ - Select endpoint returning empty `[]` now falls back to status endpoint
212
+ - `deals.stage` and similar status attributes now return correct options
213
+ - `attributeType` correctly identifies `'status'` vs `'select'` based on successful endpoint
214
+ - Error messages include both select and status error details when both fail
215
+
216
+ - **Company location updates now work correctly** (#987) - Fixed "Expected an object, but got string" error
217
+ - `processFieldValue` now preserves object-type fields (like `primary_location`) instead of converting to `[object Object]`
218
+ - `formatAttributeValue` normalizes location objects with all 10 required Attio fields (nulls where missing)
219
+ - Both company-specific (`updateCompany`) and universal (`update-record`) flows now work
220
+
221
+ - **Claude PR review dynamic import detection** (#1002, #1003) - Ring 1 scope now includes dynamically imported modules
222
+ - Adds regex patterns for dynamic imports (`await import(...)`) in scope generator
223
+ - Captures both relative (`../../path`) and `@/` alias dynamic imports
224
+ - Pre-computes alias paths from full repo and outputs alias-resolutions.json
225
+ - Adds prompt hardening to prevent "missing file" claims from sparse checkout limitations
226
+ - Fixes false positive "missing dependency" errors when PR files use `await import('@/...')` or `await import('./...')`
227
+
228
+ - **PR review workflow path alias detection** (#977) - Fixed false positive "missing file" errors
229
+ - Ring scope generator now detects `@/...` path alias imports (not just relative imports)
230
+ - Resolves `@/services/utils/foo.js` to `src/services/utils/foo.ts` for Ring 1 inclusion
231
+
232
+ - **Daily changelog workflow authentication** (#1005) - Added claude_args with required tool permissions
233
+ - Explicitly permits Read, Edit, Write for file operations
234
+ - Allows Bash(git:\*) for branch/commit/push operations
235
+ - Allows Bash(gh pr list:_), Bash(gh pr create:_) for PR operations
236
+ - Allows Bash(date:\*) for branch naming
237
+ - Ensures gh CLI has authentication inside Claude's Bash environment
238
+
239
+ - **SDK dependency pinning** (#1025, #1026) - Pinned @modelcontextprotocol/sdk to ~1.24.0 to ensure stability
19
240
 
20
241
  ### Deprecated
21
242
 
243
+ - **Old universal tool names** (#1039) - Removal: v2.0.0 (Q1 2026)
244
+ - Old noun-verb snake_case format (e.g., `records_search`, `records_get_details`)
245
+ - Old kebab-case format (e.g., `create-record`, `update-record`, `create-note`)
246
+ - Use new verb-first snake_case names (e.g., `search_records`, `create_record`, `create_note`)
247
+ - Dual aliases provide backward compatibility with deprecation warnings
248
+ - Migration guide available in `docs/MIGRATION-GUIDE.md`
249
+
250
+ - **Legacy resource-specific tools** (#1022) - Removal: v2.0.0 (Q1 2026)
251
+ - All resource-specific tools (`search-companies`, `create-person`, etc.) are deprecated
252
+ - Use universal tools instead (`search_records`, `create_record`, etc.)
253
+ - Legacy tools accessible via `DISABLE_UNIVERSAL_TOOLS=true` but emit deprecation warnings
254
+ - See `docs/MIGRATION-GUIDE.md` for migration guide
255
+
22
256
  ## [1.3.6] - 2025-12-03
23
257
 
24
258
  Documentation and testing infrastructure improvements for remote deployment support.